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时停止,保持所有表的处于一致的状态
|
|
- 删除复制过滤条件,重启复制进程
|
|
如果在遇到复制错误时,我们选择跳过错误恢复复制导致的数据不一致,因为同步一直在进行,因此我们需要将源表只读锁定再进行表备份,然后停止复制进程进行表恢复,最后启动复制解锁表。如果表数据量比较大,可以采用可传输表空间的方式进行恢复。