mysql如何检查主从复制是否正常_复制健康检查

来源:这里教程网 时间:2026-02-28 20:52:22 作者:

怎么看
Seconds_Behind_Master
是否真的可靠

很多人只看

Seconds_Behind_Master
是不是 0,就认为主从正常——这是最大误区。这个值为 0 只代表 SQL 线程追上了 relay log 的最后一条,不代表数据一致,也不代表没丢事务。

真正要确认健康,得结合多个指标一起看:

Slave_IO_Running
Slave_SQL_Running
必须都是
Yes
Seconds_Behind_Master
长期非 0(比如持续 > 60 秒),要查
SHOW PROCESSLIST
里 SQL 线程是否卡在某个慢查询或锁等待上
如果
Seconds_Behind_Master
NULL
,说明 IO 线程没连上主库,或主库 binlog 被删了(常见于
expire_logs_days
设置过小)
注意:在 GTID 模式下,
Seconds_Behind_Master
在从库重启后可能短暂显示
NULL
,等 IO 线程重连并拉取新事件后才恢复

SHOW SLAVE STATUS\G
查哪些字段不能忽略

执行这条命令后,重点盯住这几个字段,它们比

Seconds_Behind_Master
更反映底层状态:

Master_Host
Master_Port
:确认连的是预期的主库,不是误切到其他实例
Relay_Master_Log_File
Exec_Master_Log_Pos
:组合起来表示“当前已执行到主库哪个 binlog 文件和位置”,可与主库的
SHOW MASTER STATUS
对比是否滞后
Retrieved_Gtid_Set
Executed_Gtid_Set
(GTID 模式下):前者是已拉到 relay log 的事务集合,后者是已执行的;两者不等就说明 SQL 线程没跟上,哪怕
Seconds_Behind_Master=0
Last_IO_Errno
/
Last_SQL_Errno
:非 0 就代表出错了,必须立刻看
Last_IO_Error
Last_SQL_Error
具体内容

为什么
pt-table-checksum
是唯一能验证数据一致性的工具

网络延迟、重复写入、SQL 过滤规则、字符集差异……这些都可能导致主从“看起来在跑”,但数据早已不一致。

SHOW SLAVE STATUS
完全无法发现这类问题。

pt-table-checksum
是 Percona Toolkit 中专为这事设计的工具,原理是在主库分块计算校验和,并通过复制机制把校验语句传到从库执行,再对比结果:

必须在主库上运行,且账号要有
REPLICATION CLIENT
+
PROCESS
+
SELECT
权限
默认跳过系统库和视图,可通过
--databases
指定业务库
若从库报错
1062 Duplicate entry
1032 Can't find record
,说明行级不一致,要用
pt-table-sync
修复
不要在业务高峰跑全库校验,加
--chunk-size
--sleep
控制压力

监控脚本里最容易漏掉的三个检查点

自动化检查脚本常只做

SHOW SLAVE STATUS
解析,但以下三点不显式判断,等于白监控:

检查
Seconds_Behind_Master
是否为
NULL
:很多脚本用整数比较,遇到
NULL
直接报错或跳过,导致故障沉默
检查
Slave_SQL_Running_State
是否卡在
Waiting for dependent transaction to commit
(MGR 或并行复制场景),这不算错误状态,但实际已停滞
检查主库 binlog 是否被清理:在从库执行
SELECT MASTER_POS_WAIT('<code>Relay_Master_Log_File
',
Exec_Master_Log_Pos
, 1),返回
-1
就说明主库上对应 binlog 已不存在,复制不可逆中断

复制健康不是单点判断,是 IO 连通性、SQL 执行进度、GTID/position 追踪、数据一致性四层叠加验证。少一层,就可能在线上安静地腐烂一周才暴露。

相关推荐