MySQL主从复制是常用的数据库高可用架构方案,但在实际运行中,主从数据不一致是较为常见的问题,pt-table-checksum工具可以高效完成主从数据一致性的校验工作。

pt-table-checksum工作原理
pt-table-checksum基于主从复制的特性工作,主要流程如下:
- 在主库上执行校验命令,工具会将待校验的表按主键或唯一索引拆分为多个数据块
- 对每个数据块计算CRC32校验和,将校验SQL写入主库binlog
- 从库同步binlog后执行相同的校验逻辑,计算自身的块校验和
- 工具对比主从库的校验和结果,输出不一致的数据块信息
这种方式不需要直接连接从库查询数据,仅通过主库的binlog同步即可完成校验,对从库的性能影响极小。
工具安装部署
pt-table-checksum属于Percona Toolkit工具集,需要先安装依赖和工具包,以CentOS系统为例:
# 安装依赖包 yum install -y perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL perl-TermReadKey # 下载Percona Toolkit包 wget https://downloads.percona.com/downloads/percona-toolkit/3.5.0/binary/redhat/7/x86_64/percona-toolkit-3.5.0-1.el7.x86_64.rpm # 安装工具包 rpm -ivh percona-toolkit-3.5.0-1.el7.x86_64.rpm
安装完成后可以通过pt-table-checksum --version命令验证安装是否成功。
常用参数说明
pt-table-checksum的参数较多,以下是实际使用中常用的核心参数:
| 参数名 | 作用说明 |
|---|---|
| --host | 主库的连接地址 |
| --port | 主库的连接端口,默认3306 |
| --user | 连接主库的用户名,需要有校验相关表的查询权限 |
| --password | 连接用户的密码 |
| --databases | 指定需要校验的数据库,多个数据库用逗号分隔 |
| --tables | 指定需要校验的表,多个表用逗号分隔,支持通配符 |
| --replicate | 指定存储校验结果的表,默认是percona.checksums |
| --chunk-size | 每个数据块的大小,默认是1000行 |
| --no-check-binlog-format | 不检查binlog格式,适用于binlog格式不是STATEMENT的场景 |
校验操作步骤
1. 准备校验用户权限
需要在主库创建用于校验的数据库用户,授予对应权限:
-- 创建用户 CREATE USER 'checksum_user'@'127.0.0.1' IDENTIFIED BY 'CheckSum@123'; -- 授予权限 GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'checksum_user'@'127.0.0.1'; -- 刷新权限 FLUSH PRIVILEGES;
2. 执行校验命令
假设主库地址是127.0.0.1,端口3306,需要校验test_db数据库下的所有表,执行以下命令:
pt-table-checksum --host=127.0.0.1 --port=3306 --user=checksum_user --password=CheckSum@123 --databases=test_db --replicate=percona.checksums --no-check-binlog-format
3. 查看校验结果
校验完成后,工具会直接输出结果,也可以查询存储校验结果的表来获取详细信息:
SELECT
db,
tbl,
chunk,
chunk_time,
chunk_index,
lower_boundary,
upper_boundary,
this_crc,
this_cnt,
master_crc,
master_cnt,
ts
FROM percona.checksums
WHERE master_crc != this_crc OR master_cnt != this_cnt;
如果查询结果不为空,说明对应的数据块存在主从不一致的情况。
不一致数据处理
当校验出不一致数据后,可以使用pt-table-sync工具来修复,该工具同样属于Percona Toolkit,可以生成同步SQL或者直接执行同步操作。以下是生成同步SQL的示例:
pt-table-sync --execute --replicate=percona.checksums --host=127.0.0.1 --user=checksum_user --password=CheckSum@123
执行前建议先使用--print参数打印出将要执行的SQL,确认无误后再使用--execute参数执行同步,避免误操作导致数据丢失。
注意事项
- 校验过程中会对主库产生一定的查询压力,建议选择业务低峰期执行
- 如果表没有主键或者唯一索引,pt-table-checksum会采用全表扫描的方式拆分数据块,性能会明显下降,建议为校验的表添加合适的主键
- 校验前需要确认主从复制状态正常,避免因为复制延迟导致校验结果误判
- 存储校验结果的表需要提前创建,默认是percona.checksums,也可以手动指定其他表
pt-table-checksumMySQL主从复制数据一致性校验percona_toolkit修改时间:2026-07-17 03:36:13