Skip to content

pt-replica-restart

监视一个或多个 MySQL 复制副本(replica),出错时跳过引起错误的语句并重启复制。

语法

bash
pt-replica-restart [OPTIONS] [DSN]

用法示例

以下命令假定已通过选项文件或本机 socket 配置好 MySQL 连接;副本主机用 DSN(如 h=副本主机,不写明文密码)指定。本工具会跳过复制错误并重启线程,可能加剧主从数据不一致,使用前务必先排查错误根因——它用于"越过"错误而非"修复"复制。

场景:后台常驻自动重启

守护进程持续监视 replica-host,遇到可跳过的错误就自动重启复制线程:

bash
pt-replica-restart --daemonize h=replica-host

场景:只跳过指定错误号

只处理重复主键(1062)这类已知无害错误,遇到列表外的错误直接退出,避免盲目跳过其它问题:

bash
pt-replica-restart --error-numbers 1062 h=replica-host

场景:按错误文本匹配跳过

用 Perl 正则匹配 last_error 文本,只重启文本命中的错误:

bash
pt-replica-restart --error-text 'Could not parse' h=replica-host

场景:追到指定 binlog 位点就停

让副本一直追到源的 mysql-bin.000123,456789 这个坐标为止再停,常用于把副本恢复到某个已知正确位点(格式 file,pos,逗号无空格):

bash
pt-replica-restart --until-source mysql-bin.000123,456789 h=replica-host

场景:顺带监视下级副本

主副本下面还有更深的从库时,用 --recurse 2 把下级副本也一并纳入监视(深度 2),多于一个时并行 fork 监视:

bash
pt-replica-restart --recurse 2 h=replica-host

场景:靠 cron 每小时自愈重启

放进 crontab 每小时跑一次,用非默认 --sentinel 保证只停掉同一 cron 启动的实例,防服务器崩溃后漏重启:

bash
pt-replica-restart --monitor --stop --sentinel /tmp/pt-replica-restartup h=replica-host

功能说明

监视一个或多个复制副本并尝试跳过导致错误的语句。以指数变化的睡眠时间智能轮询副本; 可以指定要跳过的错误,也可以让副本运行到某个 binlog 位置为止。

注意

该工具能帮副本越过错误继续复制,但不应依赖它来"修复"复制。 如果副本错误频繁或意外出现,应找出并修复根本原因。

输出

每次发现副本出错就打印一行:默认含时间戳、连接信息、relay_log_file、relay_log_pos、last_errno。 --verbose 可增加更多信息;--quiet 抑制全部输出。

睡眠策略(SLEEP)

  • 初始睡眠时间为 --sleep
  • 检查发现错误时,睡眠时间减半;无错误时加倍。
  • 睡眠时间下界为 --min-sleep,上界为 --max-sleep
  • 刚发现错误后,工具假设下一个错误很可能马上出现,因此睡"当前睡眠时间与初始睡眠时间的较小者"。

全局事务 ID(GTID)

自 Percona Toolkit 2.2.8 起支持 MySQL 5.6.5 引入的 GTID。注意:

  • 使用多复制线程(replica_parallel_workers > 0)时不会跳过事务: 工具无法知道某个复制线程失败事务的 GTID 事件。
  • 默认跳过来自副本源(source)的下一个事务;写入可能来自不同服务器(各自 UUID),见 --source-uuid

退出状态与兼容性

0 表示成功;其他值为 Perl 进程(或多个被监控服务器时最后退出的 fork 进程)的退出状态。 SHOW REPLICA STATUS 输出列的大小写随版本变化,工具统一按小写处理。

选项

选项说明
--always即使没有错误也启动副本(开启后工具不会允许你手动停止副本!)
--ask-pass连接 MySQL 时交互式询问密码
--[no]buffer-stdout默认开启 STDOUT 缓冲;使用 tee、kubectl logs 等后处理工具想看到实时进度时可关闭
-A, --charset类型:string。默认字符集(utf8 时设置 binmode/mysql_enable_utf8 并执行 SET NAMES UTF8
--[no]check-relay-log默认:yes。检查副本错误前先检查 relay log 文件与位置是否变化;未变化则仅睡眠,防止无限循环(同一位置反复重启同一错误)。某些错误需要 --no-check-relay-log 禁用该检查——除非清楚后果否则不要用
--config类型:Array。读取逗号分隔的配置文件列表;如指定必须放在命令行第一个选项的位置
--daemonizefork 到后台并与 shell 脱离,仅限 POSIX 系统
-D, --database类型:string。使用的数据库
-F, --defaults-file类型:string。只从给定文件读取 mysql 选项,必须给绝对路径
--error-length类型:int。打印错误信息的最大长度(--verbose 足够高时截断错误文本,防止终端换行)
--error-numbers类型:hash。只重启该错误号列表(逗号分隔)中的错误;遇到不在列表中的错误则退出。错误号取自 SHOW REPLICA STATUS 的 last_errno
--error-text类型:string。只重启错误文本匹配该 Perl 正则的错误;存在但不匹配则退出。错误文本取自 last_error 列
--help显示帮助并退出
-h, --host类型:string。要连接的主机
--log类型:string。daemonize 时把全部输出打印到该文件
--master-uuid已废弃,用 --source-uuid 代替
--max-sleep类型:float;默认:64。轮询间隔的睡眠上限秒数;也是 --stop + --monitor 时等待其他实例退出的时长
--min-sleep类型:float;默认:0.015625。轮询间隔的睡眠下限秒数
--monitor是否监视副本(默认)。未显式指定时 --stop 会禁用它
-s, --mysql_ssl类型:int。创建 SSL MySQL 连接
-p, --password类型:string。连接密码(含逗号需转义)
--pid类型:string。创建指定的 PID 文件;冲突规则与自动清理见官方文档
-P, --port类型:int。连接端口
-q, --quiet抑制常规输出(并禁用 --verbose
--recurse类型:int;默认:0。同时监视指定服务器的下级副本至该层级深度。通过 SHOW PROCESSLIST 识别副本连接后接入;程序启动时找出全部副本并监视,多于一个时用 fork() 并行监视。副本配置了 report_host 等 report 参数时也可通过 SHOW REPLICAS 发现
--recursion-method类型:array;默认:processlist,hosts。查找副本的方法:processlist(SHOW PROCESSLIST,首选)、hosts(SHOW REPLICAS,MySQL 8.1 前为 SHOW SLAVE HOSTS,非标准端口时必需)、none。首选方法找不到时会尝试其他方法
--run-time类型:time。运行多久后退出(后缀 s/m/h/d,缺省 s)
--sentinel类型:string;默认:/tmp/pt-replica-restart-sentinel。该文件存在时退出
--slave-user已废弃,用 --replica-user 代替
--slave-password已废弃,用 --replica-password 代替
--replica-user类型:string。连接副本使用的用户(可在副本上用权限更低的用户,但须存在于所有副本上)
--replica-password类型:string。连接副本使用的密码(与 --replica-user 配合,所有副本上须一致)
--set-vars类型:Array。以逗号分隔的 变量=值 列表设置 MySQL 变量;默认 wait_timeout=10000;无法设置时打印警告并继续
--skip-count类型:int;默认:1。重启副本时跳过的语句数
--source-uuid类型:string。GTID 模式下跳过事务需要创建空事务;写入来自多个节点时需指定要跳过哪个 UUID 的事件。默认跳过副本源(SHOW REPLICA STATUS 的 Source_UUID)的事务。例:source1 -> replica1 -> replica2,在 replica2 上跳过 source1 写入的事件时必须指定 source1 的 UUID,否则默认用 replica1 的 UUID
--sleep类型:int;默认:1。检查副本之间的初始睡眠秒数
-S, --socket类型:string。连接使用的 socket 文件
--stop创建 sentinel 文件以停止运行中的实例:停止所有监视同一 sentinel 文件的实例。未指定 --monitor 时创建后即退出;指定时等待 --max-sleep 后删除文件继续工作。可用来优雅停止 cron 任务或替换运行实例(官方文档有每小时重启的 crontab 示例)
--until-master已废弃,用 --until-source 代替
--until-source类型:string。运行到源的该 binlog 文件与位置为止,格式 file,pos(逗号分隔,无空格);坐标取 relay_source_log_file/exec_source_log_pos。会给 START REPLICA 加 UNTIL 子句;到达后副本停止、工具退出
--until-relay类型:string。运行到中继日志的该文件与位置为止(坐标取 relay_log_file/relay_log_pos)
-u, --user类型:string。登录用户(若非当前用户)
-v, --verbose累积选项,默认 1 级:-v 增加 last_error;-vv 每次睡眠时打印当前睡眠时间
--version显示版本并退出
--[no]version-check默认:yes。检查 Percona Toolkit、MySQL 等软件的最新版本与已知问题版本(详见版本检查

DSN 选项

DSN 部分说明
Acharset默认字符集
Ddatabase默认数据库
Fmysql_read_default_file只从给定文件读取默认选项
hhost要连接的主机
ppassword连接密码(含逗号需转义)
Pport连接端口
Smysql_socket连接使用的 socket 文件
uuser登录用户(若非当前用户)
smysql_ssl创建 SSL 连接

其他信息

  • 作者:Baron Schwartz

  • 通用说明:已知问题的反馈方式、PTDEBUG 调试安全提示、系统要求基线,见 通用说明

更多细节请阅读 官方文档

Percona Toolkit 中文文档 · 社区维护的第三方学习站