pt-table-checksum/pt-table-sync
pt-table-checksum是用于MySQL主从复制数据一致性校验的工具,在主库上运行,通过将数据分成多个chunk数据块,以数据块为单位使用CRC32计算checksum再进行比较。
会话开始时,会降低innodb_lock_wait_timeout的锁超时时间,只要innodb有锁产生则立即放弃操作,并且在执行checksum前会先通过explain评估语句的执行计划成本,因此对线上业务影响很小。
注:表需要存在主键或唯一键
常用参数
| 名称 | 描述 | 
|---|---|
| –nocheck-replication-filters | 不检查复制过滤器 | 
| –no-check-binlog-format | 非STATEMENT格式时需要指定 | 
| –replicate-check-only | 只显示不同步的信息 | 
| –replicate | 把checksum信息写入到指定表中 | 
| –databases | 指定执行检查的数据库 | 
| –tables | 指定执行检查的表 | 
| h | master节点的地址 | 
| u | 用户 | 
| p | 密码 | 
| P | 端口 | 
示例
构建主从测试环境
 | 
 | 
构建测试数据
 | 
 | 
从库模拟数据缺失
 | 
 | 
执行checksum
 | 
 | 
在发现主从数据不一致后,我们可以通过pt-table-sync工具来完成数据修复,该工具会更改数据,因此建议在使用之前进行数据备份,当使用–replicate或–sync-to-master进行同步时,工具总是在主节点上执行replace into更改,对主节点当前数据不做修改,仅影响从节点。
风险因素
由于pt-table-sync会修改数据,因为建议在正式执行前注意以下事项:
- 仔细阅读文档手册 Document
 - 在测试环境进行验证
 - 提前备份生产数据
 - 先利用–dry-run或–print了解同步内容
 - 表上需要有主键或唯一键,如果没有则只能直接修改从节点的数据并指定–no-check-slave和–nobin-log
 
常用参数
| 名称 | 描述 | 
|---|---|
| –replicate | 如果之前执行pt-table-checksum时结果保存在表中则可以直接使用该表 | 
| –databases | 指定数据库 | 
| –tables | 指定表 | 
| –sync-to-master | 指定DSN | 
| 打印命令 | |
| –execute | 执行命令 | 
| h | 主机名 | 
| u | 用户 | 
| p | 密码 | 
| P | 端口 | 
对于–replicate和–sync-to-master之间的DSN的关系需要具有以下了解:
 | 
 | 
示例
由于需要基于语句的复制,在执行时会设置binlog_format为statement,因此用户需要有super权限
执行修复
 | 
 | 
再次检查
 | 
 | 
###单表备份恢复
在复制通道遇到数据异常错误导致中断后,我们可以通过单表备份恢复进行修复,大致步骤如下:
- 在主库通过mysqldump备份数据表,并在从库恢复
 
 | 
 | 
- 由于备份表的数据领先于其它表,因此需要设置过滤该表
 
 | 
 | 
- 启动复制通道,并指定回放到备份表的GTID时停止,保持所有表的处于一致的状态
 
 | 
 | 
- 删除复制过滤条件,重启复制进程
 
 | 
 | 
如果在遇到复制错误时,我们选择跳过错误恢复复制导致的数据不一致,因为同步一直在进行,因此我们需要将源表只读锁定再进行表备份,然后停止复制进程进行表恢复,最后启动复制解锁表。如果表数据量比较大,可以采用可传输表空间的方式进行恢复。