pt-table-checksum是percona toolkit中专用于mysql主从数据一致性校验的成熟工具,它通过主库分块计算校验和、复制到从库比对的方式实现低侵入、不锁表、不影响业务的高效校验。

直接在主库运行 pt-table-checksum,它自动分块计算校验值、通过复制同步到从库比对,全程不锁表、不中断业务——这是目前最成熟、低干扰的线上一致性校验方式。
环境准备:三件事必须确认
校验结果是否可信,取决于底层状态是否就绪:
- 所有从库
Seconds_Behind_Master = 0,且Slave_IO_Running和Slave_SQL_Running均为Yes - 主库显式配置
report_host和report_port(不能依赖已废弃的SHOW SLAVE HOSTS) - 校验账号(如
chkuser)已在每个从库执行授权:
GRANT SELECT, REPLICATION CLIENT ON *.* TO 'chkuser'@'%'; FLUSH PRIVILEGES;
安全执行:关键参数要写全
避免默认发现逻辑带来的不确定性,用明确参数控制行为:
-
--recursion-method=dsn=D=percona,t=dsns:提前在主库建好percona.dsns表,填入各从库连接信息(IP、端口、用户、密码),确保可控可审计 -
--replicate=percona.checksums:该表需在所有从库存在、结构一致、可写(工具会自动创建,但必须能被复制并落地) -
--no-check-binlog-format:适配 ROW 模式(MySQL 5.7+ 默认),避免因 binlog 格式报错中断 -
--max-lag=1:从库延迟超 1 秒自动暂停,防止校验“追着延迟跑” -
--chunk-time=0.5(默认值,可微调):每块处理目标时间 ≤0.5 秒,负载高时自动缩小块,保障业务查询不卡顿
结果验证:别只看命令行输出
Diffs = 0 不代表真正一致——校验结果默认静默写入 percona.checksums 表,需人工查表确认:
- 校验完成后,立即在主库执行:
SELECT db,tbl,chunk,master_cnt,this_cnt,master_crc,this_crc FROM percona.checksums WHERE master_cnt != this_cnt OR master_crc != this_crc; -
master_cnt = 0 && this_cnt > 0:从库有数据、主库没有(典型如从库被误写或复制过滤漏主库变更) -
this_cnt = 0 && master_cnt > 0:复制中断,整块数据未同步过去 - 查询无返回,才表示当前校验范围内数据一致
避坑要点:常见失效场景
显示一致但实际偏差?大概率是以下原因:
-
Skipped过多:默认 chunk 超时 0.5 秒,大字段或慢索引易触发;可加--chunk-time=1.0或--chunk-size=5000,但不宜过大,否则锁等待风险上升 -
Diffs = 0却知道数据不对:先登录从库执行SELECT * FROM percona.checksums LIMIT 1;,确认该表是否真实同步并写入了校验值(若为空,说明复制链路未覆盖该表或权限不足) - 连不上从库:检查从库
bind_address是否放开远程访问(不能是127.0.0.1),MySQL 8.0+ 用户认证插件是否兼容(caching_sha2_password需搭配新版 Percona Toolkit ≥3.4.0)











