pt-table-checksum必须连主库且binlog_format需为STATEMENT或MIXED;ROW格式下需加--no-check-binlog-format,但存在非确定性函数导致误判风险,工具不支持直连从库或中间件。

必须连主库,且 binlog_format=ROW 不行
pt-table-checksum 只能连接主库执行,不能连从库或中间件。它依赖主库的 binlog 事件传播机制,把校验 SQL 通过复制流发到从库——所以主库必须开启 binlog,且 binlog_format 必须是 STATEMENT 或 MIXED;ROW 格式下,从库收不到校验语句,工具会直接报错退出或漏检。
常见错误现象:Cannot replicate statement because it uses row-based replication 或 No slaves found(其实是复制链路没通)。
- 若线上主库已强制设为
ROW(MySQL 5.7+ 默认),必须加--no-check-binlog-format参数跳过检查,但需确认从库也支持该语句在 ROW 模式下安全执行(例如避免NOW()、UUID()等非确定性函数) - 不要试图用
--replicate-host指定从库地址来“绕过主库”——工具设计就是主库驱动,强行改入口会导致 checksum 写不进percona.checksums表 - 校验用户必须有
SUPER或REPLICATION CLIENT权限,否则SHOW SLAVE STATUS查不到从库延迟,工具会误判为无从库而终止
表必须有主键或唯一非空索引
没有主键或唯一非空索引的表会被自动跳过,输出里 SKIPPED 列会增加,且不会报错——容易被忽略,导致你以为“全库校验完了”,其实关键表根本没测。
常见错误现象:日志里出现 Cannot chunk table without a primary key or unique not null index,但命令仍返回成功码(0),让人误以为没问题。
- 用
SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql','performance_schema') AND TABLE_NAME NOT IN (SELECT TABLE_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE CONSTRAINT_NAME='PRIMARY' OR (CONSTRAINT_NAME!='PRIMARY' AND NON_UNIQUE=0)) GROUP BY TABLE_SCHEMA, TABLE_NAME;提前筛查缺失索引的表 -
TEXT/BLOB字段参与 CRC32 计算时可能被截断(取决于max_allowed_packet和字段实际长度),建议用--ignore-columns排除这类列,或改用--chunk-index指定更稳定的索引分片 - 复合主键中含
NULL值的列会导致分块边界错乱,务必确保所有主键列都NOT NULL
校验结果看 DIFFS,不是看 ROWS 或 TIME
DIFFS 是唯一可信的一致性指标,值为 0 才代表该表主从数据一致;ROWS 是估算行数,TIME 只反映耗时,两者都不能说明数据是否对得上。
常见错误现象:看到 ROWS=10000000 就觉得“大表跑完了”,结果 DIFFS=1 却没注意,后续修复时才发现整块数据偏差。
- 输出中某行
DIFFS非零,说明至少有一个 chunk 的 CRC32 校验和不匹配,需配合--replicate-check-only查具体哪张表、哪个 chunk 不一致 -
ERRORS> 0 不一定代表数据不一致,可能是锁超时、权限不足或从库暂时不可达,需结合日志里 ERROR 行具体内容判断 - 多从库环境下,
DIFFS是各从库最大值,比如从库 A 差 1 块、从库 B 差 0 块,结果仍显示DIFFS=1
别信默认参数,必须调 --chunk-size 和 --max-load
默认 --chunk-size=1000 在高并发或慢盘实例上极易触发锁等待超时,而默认 --max-load="Threads_running=25" 对小规格云数据库(如 2C4G)过于宽松,可能压垮业务。
常见错误现象:校验中途卡住、从库延迟飙升、业务查询大面积超时,但工具仍在运行,误以为“还在正常工作”。
- 先用
SELECT @@innodb_lock_wait_timeout;查当前值,再设--set-vars innodb_lock_wait_timeout=1(工具默认已设,但显式声明更稳妥) - 根据实例规格调
--max-load:2C 实例建议"Threads_running=10",4C 建议"Threads_running=15",并加上"Threads_connected=200"防连接数爆满 -
--chunk-time=0.3比默认0.5更保守,尤其在 SSD 性能波动或从库 IO 负载高时,能减少 chunk 大小抖动带来的同步延迟
DIFFS 后那一行被跳过的 warning、那个没主键却没报错的表、以及 --no-check-binlog-format 开关背后隐藏的非确定性风险。


















