天天看点

Percona Toolkit系列之十一:pt-slave-restart

作者:paulpei
  1. pt-slave-restart 监视一个或多个 MySQL 复制的从是否有错误,如果复制停止,则尝试重新启动复制。

基本使用语法为:pt-slave-restart [OPTIONS] [DSN]

下面列表列出部分options,更加详细的请使用pt-slave-restart --help进行查看

OPTIONS:

OPTIONS 短操作符 类型 默认值 简要说明
--always 即使没有错误也启动从站
--ask-pass 连接 MySQL 时提示输入密码。
--[no]check-relay-log 在检查从站错误之前检查最后一个中继日志文件和位置
--daemonize 放在后台以守护进程的形式运行
--database -D s 连接到这个数据库。
--host -h s 连接到主机。
--log 守护进程时将所有输出打印到此文件
--max-sleep f 64 pt-slave-restart 在再次轮询从设备之前将休眠的最长时间
--min-sleep f 0.015625 pt-slave-restart 在再次轮询从设备之前将休眠的最短时间
--monitor 是否监控从机
--password -p 连接时使用的密码。如果密码包含逗号,它们必须用反斜杠转义
--port -P i 用于连接的端口号。
--recurse i 监视指定服务器的从服务器,最多可达层次结构深处的指定服务器数量。默认 0 表示“只观察指定的从”。
--recursion-method a 用于查找从站的首选递归方法,可能的方法有:Processlist,hosts,none
--run-time m 退出前运行的时间。在指定的时间过去后停止。可选后缀:s=秒,m=分钟,h=小时,d= 天;如果没有后缀,则使用 s。
--sentinel s

如果此文件存在,则退出。默认值:

/tmp/pt-slave-restart-sentinel

--slave-user s 设置用于连接到从的用户
--slave-password s 设置用于连接到从站的密码
--skip-count i 1 重新启动从站时要跳过的语句数。
--master-uuid s 使用 GTID 时,应创建一个空事务以跳过它
--socket -S 用于连接的套接字文件。
--stop 创建--sentinel 文件,并停止运行实例
--until-master s 运行直到这个主日志文件和位置
--until-relay s 运行直到这个中继日志文件和位置
--user -u 如果不是当前用户,则用于登录的用户。

类型备注:s=string, i=integer, f=float, h/H/a/A=comma-separated list, d=DSN, z=size, m=time

DSN为要操作的数据库和表。

DSN:

DSN 简要说明
A 默认字符集。
D 数据库。
F 仅从给定文件中读取默认选项
h 连接到主机。
p 连接时使用的密码。如果密码包含逗号,它们必须用反斜杠转义
P 用于连接的端口号。
S 用于连接的套接字文件。
u 如果不是当前用户,则用于登录的用户。
  1. 基本使用样例
  • 跳过错误(--skip-count )

目前,有数据库test,存在如下表t_goods:

CREATE TABLE `t_goods` (

`goodid` int NOT NULL,

`goodname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

PRIMARY KEY (`goodid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

表中有数据如下:

1 电视

2 冰箱

假设,我们在Slave上,先执行如下插入SQL:

INSERT INTO t_goods VALUES(3,'烤箱');

在Master上,后执行如下插入SQL:

INSERT INTO t_goods VALUES(3,'烤箱');

INSERT INTO t_goods VALUES(4,'电脑');

INSERT INTO t_goods VALUES(5,'手机');

则引发主从复制错误,这里,我们比较明确知道错误原因,则需要跳过发生错误的语句即可:

pt-slave-restart h=192.168.246.136,u=root,p=Ygzlpaul*2022 --skip-count=1

打印如下信息:

2022-11-19T23:32:29 h=192.168.246.136,p=...,u=root m_slave-relay-bin.000011 2871 1062

验证Slave状态,正常

2.2 跳过GTID (--master-uuid )

模拟发生错误同2.1,只是这里开启了GTID模式,则,我们需要查看并找到错误的GTID值:

8c17f5a5-55f6-11ed-a854-000c295b9532:5

pt-slave-restart h=192.168.246.136,u=root,p=Ygzlpaul*2022 --master-uuid=8c17f5a5-55f6-11ed-a854-000c295b9532

注1:上面仅仅需要UUID值,而无需TID值

打印如下信息:

2022-11-20T00:16:40 h=192.168.246.136,p=...,u=root m_slave-relay-bin.000002 1536 1062

验证Slave状态,正常

注2:需要在Slave上,先执行如下SQL:SET GLOBAL slave_parallel_workers=0

否则,会报告如下错误:

Cannot skip transactions properly because GTID is enabled and slave_parallel_workers > 0. See 'GLOBAL TRANSACTION IDS' in the tool's documentation.

继续阅读