pt-table-checksum连不上从库主因是从库网络不可达、权限不足或report_host配置错误;必须确保从库bind_address=0.0.0.0、checksum_user在从库显式授权select和replication client、且report_host/port配置正确。

直接用 pt-table-checksum 就行,但必须确保从库能被主库工具连上、权限给够、复制延迟清零——否则校验结果全是假阴性或跳过。
为什么 pt-table-checksum 连不上从库
它不是只连主库,而是会自动发现从库(通过 SHOW SLAVE HOSTS 或 report_host/report_port 配置),然后用同一套账号密码去连每个从库执行 SHOW SLAVE STATUS 和读 percona.checksums 表。常见失败点:
-
Can't connect to slave:从库bind_address = 127.0.0.1或防火墙拦了,得改成0.0.0.0并开放端口 -
Access denied:账号没在从库上显式授权,光在主库建用户没用;必须在每个从库执行:GRANT SELECT, REPLICATION CLIENT ON *.* TO 'checksum_user'@'%'; FLUSH PRIVILEGES; - MySQL 5.7 默认用
mysql_native_password,没问题;但如果你手动改过认证插件(比如升级后残留配置),要检查SELECT plugin FROM mysql.user WHERE user='checksum_user';,不是mysql_native_password就得重置 -
report_host没配或配错:pt-table-checksum会优先读这个值来连从库,而不是靠SHOW SLAVE HOSTS(该命令在 5.7 已废弃且常返回空);务必在从库my.cnf里加:[mysqld]<br>report_host = 192.168.1.101<br>report_port = 3306
校验时显示 Skipped 或 Diffs = 0 却实际不一致
这几乎一定是“校验期间从库还没追上”,不是工具失灵。关键要看三件事:
- 跑校验前,先在每个从库执行:
SHOW SLAVE STATUS\G,确认Seconds_Behind_Master: 0,且Slave_IO_Running和Slave_SQL_Running都是Yes -
Skipped行多,大概率是 chunk 超时:默认每块最多跑 0.5 秒,遇到大字段或慢索引就放弃;可加参数调宽松:--chunk-time=1.0 --max-load="Threads_running=20" -
Diffs = 0但你知道数据不对?检查percona.checksums表是否真同步到了从库:SELECT * FROM percona.checksums WHERE db='test' AND tbl='t2'\G;如果从库查不到记录,说明复制中断过,或者binlog-do-db过滤掉了percona库 - 别忽略
this_cnt和master_cnt字段:若this_cnt = 0且master_cnt > 0,代表从库整块数据缺失,不是校验失败,是复制根本没传过去
pt-table-sync 修复前必须验证的三件事
它不校验业务逻辑,只按 percona.checksums 里标记的 diff 行生成 SQL —— 一旦参数写反,就是主库被从库覆盖。
- 必须加
--print先看生成的 SQL 是什么,别一上来就--execute;输出里如果出现REPLACE INTO `test`.`t2`对应你改过的那条数据,才说明方向对 - 修复命令里必须明确指定源和目标:
想用主库修从库 → 加--sync-to-master(此时从库是目标)
想用从库修主库(极少见)→ 加--slave(此时主库是目标);参数漏写或写反,后果自负 - 有自增主键、触发器、外键的表,
REPLACE可能失败;加--no-check-triggers --no-foreign-key-checks,但得确保业务侧没依赖这些约束做校验 - MySQL 5.7 的
read_only=1会阻止pt-table-sync写入,临时关掉:SET GLOBAL read_only = 0;,修完再开
最常被跳过的动作是:没等 Seconds_Behind_Master 归零就开跑,以及忘了在从库上单独授权 checksum_user。这两步一漏,后面所有输出都不可信。











