pt-table-checksum 使用指南:在binlog格式为ROW的从库上使用时的注意细节

pt-table-checksum 使用指南:在binlog格式为ROW的从库上使用时的注意细节

pt-table-checksum可以在binlog格式为ROW的从库上运行,但需要正确配置。

工作原理

pt-table-checksum通过在主库上执行校验和查询,并利用MySQL复制机制将结果传播到从库:

  1. 在主库计算数据块的校验和
  2. 结果写入percona.checksums
  3. 通过复制同步到从库
  4. 在从库比较本地数据与主库传来的校验和

ROW格式下的特殊考虑

需要满足的条件:

  1. 启用binlog(无论主从)
  2. 设置binlog_format = STATEMENT用于校验和操作:
    -- 会话级设置(推荐)SETSESSIONbinlog_format='STATEMENT';-- 或者在my.cnf中为特定用户设置

正确的执行方式:

# 推荐:让工具自动处理格式转换pt-table-checksum\--replicate=percona.checksums\--no-check-binlog-format\--empty-replicate-table\--create-replicate-table\--recursion-method=hosts\h=主库IP,u=用户,p=密码# 或者显式设置pt-table-checksum\--set-vars"binlog_format=STATEMENT"\--replicate=percona.checksums\h=主库IP

常见问题和解决方案:

问题原因解决方案
复制错误ROW格式无法执行校验和语句使用--set-vars或让工具自动转换
权限不足需要SUPER权限改会话变量授予用户SUPER权限
不一致结果从库也在写入数据使用--pause-file控制节奏

推荐的最佳实践:

  1. 在主库执行(而不是直接在从库):

    pt-table-checksum\--replicate=percona.checksums\--no-check-binlog-format\--max-lag=1s\--check-interval=2\--recursion-method=dsn=D=percona,t=dsns\h=master_host
  2. 配置示例(my.cnf):

    [mysqld] # 默认可以保持ROW格式 binlog_format = ROW # pt-table-checksum所需 binlog_rows_query_log_events = ON log_slave_updates = ON
  3. 检查结果

    # 在从库上检查差异SELECT db, tbl, SUM(this_cnt)AS total_rows, COUNT(*)AS chunks FROM percona.checksums WHERE master_cnt<>this_cnt OR master_crc<>this_crc GROUP BY db, tbl;

注意事项

  • pt-table-checksum总是在主库执行计算
  • 从库只需要能够正常复制并读取校验和结果
  • ROW格式本身不阻止校验,但校验过程需要STATEMENT格式
  • ⚠️ 如果从库有写入(如双主架构),需格外小心
  • ⚠️ 大表可能产生大量binlog,建议在低峰期进行