校验逻辑是通过 SQL 采集目标节点的数据库,如果目标数据库系统当前存在异常,无疑是雪上加霜 , 将会触发未知问题,所以添加超时机制,单次取数据块的阈值是5s,超过5秒就放弃等待重试 。测试发现 , 有时候即便触发超时了 , 但是 SQL 任务还是会在目标数据库的 processlist 中能看到,所以又添加了一个 kill 机制,超时后会触发一个 kill processlist id 的动作 。另外为了避免 kill 错,在每个 SQL 对象添加了一个32位的 md5 值 , 每次 kill 的时候会校验这个 md5 值 。
本工具借鉴 pt-table-checksum 工具思路改写,可以检查随意两个 mysql(支持 mysql sql 语法的数据库)节点的数据一致性 。
基于主键以一个块遍历数据表,比对checksum的值 , 块的大小可通过参数指定 。(1)获取该表的第一个数据块的查询SQL 。(2)将两个目标节点的数据块的checksum的值,记录到临时文件,file1 file2 。(3)比对file1 file2是否一致 。
第一步:先开启一个 screen 监控网络
第二步:新开启一个screen执行校验任务
(1)info.log 文件
(2)list目录
(3)md5 目录
(4)pri 目录
(5)res 目录
这是 table 目录下记录某个数据块不一致的一个例子
这是 diff 目录下记录某个数据行不一致的一个例子
(6)skip.log 文件
本工具是参考了 pt-table-checksum 工具的一些思路并结合自身经验进行改写,尚有很多不足之处,仅做学习交流之用 , 如有线上环境使用需求 , 请在测试环境充分测试 。
MySQL主备库数据一致性校验及修复很多时候需要把一个从库提升为主库,但对从库和主库的数据一致性不敢保证,这时我们就可以利用 pt-table-checksum来检查主库数据的一致性,如果存在不一致的数据,我们可以利用pt-table-sync来修复这些不一致的数据 。
在主(master)上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果 。
下面通过实际的例子来解释该工具如何使用:
主库(10.8.23.209)数据:
从库(10.8.23.208)数据:
从库(10.8.23.210)数据:
很明显主备数据不一致,我们使用工具来检测下:
校验命令参数解释:
校验结果字段解释:
好了,命令以及常用参数都介绍了,一起解释下上面执行的效果,通过DIFFS 是1 就可以看出主从的表数据不一致 。怎么不一致呢? 通过指定—replicate=test.checksums 参数,就说明把检查信息都写到了checksums表中 。
进入备库(10.8.23.208)中查看checksums表的信息:
进入备库(10.8.23.210)中查看checksums表的信息:
通过上面找到了这些不一致的数据,如何修复呢?利用另外一个工具 pt-table-sync 。
高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据 。他可以同步单个表,也可以同步整个库 。它不同步表结构、索引、或任何其他模式对象 。所以在修复一致性之前需要保证他们表存在 。接着上面的复制情况,主库和从库的aaa表数据不一致,需要修复 。
参数解释:
命令介绍完了,一起解释下执行的效果:通过(--print)打印出来了修复数据的sql语句,可以手动的去从行执行,让他们数据保持一致性 。那能否直接执行?当然可以,通过(--execute)
没发现任何异常,然后检查主从数据的一致性:
主库(10.8.23.209)数据:
从库(10.8.23.208)数据:
从库(10.8.23.210)数据:
OK,数据已经保持一致了 。
不过建议还是--print 打印出来的好,这样就可以知道那些数据有问题,可以人为的干预下 。
推荐阅读
- 新颖的毕业设计网站,毕业设计网站制作
- 关于什么叫正版印度舞蹈视频的信息
- 在电商平台如何变更收货人,收货人如何更改收货地址
- 快手直播签约设置不了,快手直播不签约怎么提成的?
- python截屏函数 python pil截图
- 小程序开发用哪个,小程序开发哪个平台好
- 解谜游戏阴阳先生,阴阳先生的奇闻异事
- u盘装系统系统是什么格式,u盘装系统好用
- php7数据类型 php常用数据类型的语法格式