Heim  >  Artikel  >  Datenbank  >  用pt-table-sync修复不一致的数据

用pt-table-sync修复不一致的数据

WBOY
WBOYOriginal
2016-06-07 16:43:071070Durchsuche

上一篇用pt-table-checksum校验数据一致性介绍了校验主从数据是否一致的方法,当确定主从数据不一致后,就要考虑如何修复。这里推

上一篇用pt-table-checksum校验数据一致性介绍了校验主从数据是否一致的方法,当确定主从数据不一致后,就要考虑如何修复。这里推荐percona-toolkit的另外一个重要工具:pt-table-sync。

percona-toolkit的安装及简介 

percona-toolkit 之 【pt-summary】、【pt-mysql-summary】、【pt-config-diff】、【pt-variable-advisor】说明 

pt-table-sync简介

顾名思义,它用来修复多个实例之间数据的不一致。它可以让主从的数据修复到最终一致,也可以使通过应用双写或多写的多个不相关的数据库实例修复到一致。同时它还内部集成了pt-table-checksum的校验功能,可以一边校验一边修复,也可以基于pt-table-checksum的计算结果来进行修复。

工作原理 1. 单行数据checksum值的计算

计算逻辑与pt-table-checksum一样,也是先检查表结构,并获取每一列的数据类型,把所有数据类型都转化为字符串,然后用concat_ws()函数进行连接,由此计算出该行的checksum值。checksum默认采用crc32计算。

2. 数据块checksum值的计算

同pt-table-checksum工具一样,pt-table-sync会智能分析表上的索引,然后把表的数据split成若干个chunk,计算的时候以chunk为单位。可以理解为把chunk内所有行的数据拼接起来,再计算crc32的值,即得到该chunk的checksum值。

3. 坏块检测和修复

前面两步,pt-table-sync与pt-table-checksum的算法和原理一样。再往下,就开始有所不同:

pt-table-checksum只是校验,所以它把checksum结果存储到统计表,然后把执行过的sql语句记录到binlog中,任务就算完成。语句级的复制把计算逻辑传递到从库,并在从库执行相同的计算。pt-table-checksum的算法本身并不在意从库的延迟,延迟多少都一样计算(有同事对此不理解,,可以参考我的前一篇文章),不会影响计算结果的正确性(但是我们还是会检测延迟,因为延迟太多会影响业务,所以总是要加上—max-lag来限流)。
pt-table-sync则不同。它首先要完成chunk的checksum值的计算,一旦发现主从上同样的chunk的checksum值不同,就深入到该chunk内部,逐行比较并修复有问题的行。其计算逻辑描述如下(以修复主从结构的数据不一致为例,业务双写的情况修复起来更复杂—因为涉及到冲突解决和基准选择的问题,限于篇幅,这里不介绍):

重要选项 安全选项

—[no]check-triggers 检查是否有触发器,有则警告
—[no]foreign-key-checks 默认检查主外键约束,有则警告
—[no]unique-checks 检查是否有唯一索引,无则警告

过滤选项

—ignore-databases
—ignore-engines
—ignore-tables

其他选项

—replicate=s 与pt-table-checksum结合起来,只修复,而不校验。使用pt-table-checksum之前校验的结果
—bidirectional 双向同步。通常都以主库的数据为准,如果开启双向同步,就要定义冲突解决规则,会比较复杂

用法举例

假设10.55.55.55是主库,10.73.73.73是它的从库,端口在3306。
1. 先校验:
PTDEBUG=1 ./pt-table-checksum --user=user --password=pass --host=10.55.55.55 --port=3306 --databases=elink --tables=my_cms_10 --recursion-method=processlist 2. 根据校验结果,只修复10.73.73.73从库与主库不一致的地方:
PTDEBUG=1 ./pt-table-sync --execute --replicate percona.checksums --sync-to-master h=10.73.73.73,P=3306,u=user,p=pass 3. 修复后,再重新校验一次。执行第一步的语句即可。
4. 检查修复结果: 登陆到10.73.73.73,执行如下sql语句返回若为空,则说明修复成功: select * from percona.checksums where master_cnt this_cnt OR master_crc this_crc OR ISNULL(master_crc) ISNULL(this_crc)

注意事项 总结

pt-table-sync工具很复杂也很强大。它修改数据库的内容,所以可能造成安全事故。为了安全,建议:使用pt-table-checksum定期检测数据的一致性,并手动重建损坏较为严重的从库,最后才用pt-table-sync修复剩下的从库。

本文永久更新链接地址:

linux

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn