如何使用pt工具校验修复主从

70次阅读
没有评论

共计 3017 个字符,预计需要花费 8 分钟才能阅读完成。

这篇文章主要为大家展示了“如何使用 pt 工具校验修复主从”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“如何使用 pt 工具校验修复主从”这篇文章吧。

使用 pt 工具校验主从一致性并修复【原理说明】 

     pt-table-checksum  是 Percona-Toolkit
的组件之一,用于检测 MySQL 主、从库的数据是否一致。其原理是在主库执行基于 statement 的 sql 语句来生成主库数据块的 checksum,把相同的 sql 语句传递到从库执行,并在从库上计算相同数据块的 checksum,最后,比较主从库上相同数据块的 checksum 值,由此判断主从数据是否一致。检测过程根据唯一索引将表按 row 切分为块(chunk),以为单位计算,可以避免锁表。检测时会自动判断复制延迟、
master 的负载,超过阀值后会自动将检测暂停,减小对线上服务的影响。
   pt-table-checksum  默认情况下可以应对绝大部分场景,官方说,即使上千个库、上万亿的行,它依然可以很好的工作,这源自于设计很简单,一次检查一个表,不需要太多的内存和多余的操作;必要时,pt-table-checksum  会根据服务器负载动态改变 chunk 大小,减少从库的延迟。
    为了减少对数据库的干预,pt-table-checksum 还会自动侦测并连接到从库,当然如果失败,可以指定 –recursion-method 选项来告诉从库在哪里。它的易用性还体现在,复制若有延迟,在从库
checksum 会暂停直到赶上主库的计算时间点(也通过选项 – 设定一个可容忍的延迟最大值,超过这个值也认为不一致)。
    为了保证主数据库服务的安全,该工具实现了许多保护措施:

    1)自动设置  innodb_lock_wait_timeout  为 1s,避免引起锁

    2)默认当数据库有 25 个以上的并发查询时,pt-table-checksum 会暂停。可以设置  –max-load  选项来设置这个阀值
    3)当用
    Ctrl+C 停止任务后,工具会正常的完成当前 chunk 检测,下次使用  –resume  选项启动可以恢复继续下一个
    chunk

【工作过程】

1.
连接到主库:pt 工具连接到主库,然后自动发现主库的所有从库。默认采用 show slave hosts 来查找从库,但是这只有在主从实例端口相同的情况下才有效。

2.
查找主库或者从库是否有复制过滤规则:这是为了安全而默认检查的选项。你可以关闭这个检查,但是这可能导致 checksum 的 sql 语句要么不会同步到从库,要么到了从库发现从库没有要被 checksum 的表,这都会导致从库同步卡库。

3. 开始获取表,一个个的计算。

4.
如果是表的第一个 chunk,那么 chunk-size 一般为 1000;如果不是表的第一个 chunk,那么采用 12 步中分析出的结果。

5. 检查表结构,进行数据类型转换等,生成 checksum 的 sql 语句。

6. 根据表上的索引和数据的分布,选择最合适的 split 表的方法。

7. 开始 checksum 表。

8. 默认在 chunk 一个表之前,先删除上次这个表相关的计算结果。除非–resume。

9.
根据 explain 的结果,判断 chunk 的 size 是否超过了你定义的 chunk-size 的上限。如果超过了,为了不影响线上性能,这个 chunk 将被忽略。

10. 把要 checksum 的行加上 for update 锁,并计算。

11. 把计算结果存储到 master_crc master_count 列中。

12. 调整下一个 chunk 的大小。

13.
等待从库追上主库。如果没有延迟备份的从库在运行,最好检查所有的从库,如果发现延迟最大的从库延迟超过 max-lag 秒,pt 工具在这里将暂停。

14. 如果发现主库的 max-load 超过某个阈值,pt 工具在这里将暂停。

15. 继续下一个 chunk,直到这个 table 被 chunk 完毕。

16. 等待从库执行完 checksum,便于生成汇总的统计结果。每个表汇总并统计一次。

17. 循环每个表,直到结束。

【校验脚本】

pt 工具如果使用不当,会影响业务正常使用,甚至出现死锁情况,下面结合生产经验,使用如下参数进行校验

TS:完成检查的时间戳。

ERRORS
   :检查时候发生错误和警告的数量。

DIFFS:不一致的 chunk 数量。当指定  –no-replicate-check  即检查完但不立即输出结果时,会一直为 0;当指定  –replicate-check-only  即不检查只从 checksums 表中计算 crc32,且只显示不一致的信息(毕竟输出的大部分应该是一致的,容易造成干扰)。

ROWS:比对的表行数。

CHUNKS:被划分到表中的块的数目。

SKIPPED
   :由于错误或警告或过大,则跳过块的数目。

TIME:执行的时间。

TABLE:被检查的表名

【修复脚本】

点击 (此处) 折叠或打开

user=

password=

charset= utf8mb4

replicate= pt.checksum

chunk_size= 1500

pid= /data/script/mysql/pt-table-sync.pid

sync_to_master= h=10.9.129.33,P=3306

tables= kuaikan.device_push_info

/usr/bin/pt-table-sync  \

–user=${user} \

–password=${password} \

–pid=${pid}  \

–bin-log \

–tables= ${tables} \

–buffer-in-mysql  \

–no-buffer-to-client \

–charset=${charset} \

–no-check-child-tables \

–no-foreign-key-checks  \

–check-master \

–replicate=${replicate} \

–sync-to-master  ${sync_to_master} \

–check-slave \

–check-triggers \

–chunk-size=${chunk_size} \

–print \

–transaction \

–verbose

【修复脚本参数说明】

1)print 只是打印需要执行的命令,确认无误后把参数—print 改成—execute
2)sync_to_master 此处填写从库的地址,只需要填写从库地址,会自动从从库 show slave status 获取主库的信息,不需要再写主库的地址,写了从库地址后,会根据从库差异对这个从库进行更改,无论如何都是在 master 端执行。并不会对其他从库的差异进行修复。
3)no-buffer-to-client 如果禁用该选项的话,MySQL 会一次性发送所有的 rows,针对大表
4)lock 参数如果 使用—replicate 或者 –sync-to-master 参数时,slave 端 是不会锁表的。锁表的时候使用的是 lock tables,但是如果使用 –transaction 的话,就是在事务开始到提交这一段,开始锁表

以上是“如何使用 pt 工具校验修复主从”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计3017字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)