pt-table-checksum 检测主从是否一致

学习技术需要掌握

作用、原理、安装步骤、工具使用、模拟演示、注意细节、优点缺点

一、 pt-table-checksum原理和作用

作用:主要是检查mysql的主从数据是否一致

原理:

1、检查每张表的数据类型是否一致

pt工具先检查表的结构,并获取每一列的数据类型,把所有数据类型都转化为字符串,然后用concat_ws()函数进行连接,由此计算出该行的checksum值。checksum默认采用crc32,你可以自己定义效率更高的udf。

2、计算数据是否一致

如果一行一行的计算checksum再去和从库比较,那么效率会非常低下。

pt工具选择智能分析表上的索引,然后把表的数据split成一个个chunk,计算的时候也是以chunk为单位。因此引入了聚合函数BIT_XOR()。它的功能可以理解为把这个chunk内的所有行的数据拼接起来,再计算crc32的值,就得到这个chunk的checksum值。这其中还有count(*),用来计算chunk包含的行数。每一次对chunk进行checksum后,pt工具都会对耗时进行统计分析,并智能调整下一个chunk的大小,避免chunk太大对线上造成影响,同时也要避免chunk太小而效率低下。

3、一致性如何保证
 
当pt工具在计算主库上某chunk的checksum时,主库可能还在更新,同时从库可能延迟使得relay-log中还有与这个chunk数据相关的更新,那该怎么保证主库与从库计算的是”同一份”数据?
答案是加for update当前读锁,这保证了主库的某个chunk内部数据的一致性。否则,1000个人chekcusm同样的1000行数据,可能得到1000个不同的结果,你无法避开mvcc的干扰!获得for update锁后,pt工具开始计算chunk的checksum值,并把计算结果保存到pt工具自建的结果表中(采用replace into select的方式),然后释放锁。该语句最终会传递到从库并执行相同的计算逻辑。

二、工具使用 

① 创建checksum用户,用于测试数据

grant all privileges on *.* to 'checksums'@'192.168.88.%' identified by '123456';

② 用pt-table-checksum命令

pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --host=192.168.88.129 --user=checksums --password=123456 --port=3306 --no-check-binlog-format

 --nocheck-replication-filters:不检查复制过滤器,建议启用

--databases=test : 数据库

--replicate=test.checksums 把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中

--no-check-binlog-format 不检查复制的binlog模式,要是binlog模式是ROW,则会报错

③结果分析

Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
05-15T01:51:40      0      0        1          0       1       0   1.022 test.heartbeat
05-15T01:51:47      0      0  1314688          0       6       0   7.202 test.x
05-15T01:51:48      0      1        3          0       1       0   1.022 test.y

DIFFS就是主从不一致的数据,我这里test.y表有一个不一样的。

三、注意细节

① 表中没有索引,pt-table-checksum将没办法处理 

②.表中只有普通索引。当数据列有重复并且正好在分块的交界中,将会报错。所以表中最好有一个唯一索引列。

③ 块的定义过大。当块大于表的行数时,将会产生全表锁。

④内部重要流程

1、SET @@binlog_format := 'STATEMENT'

2、创建校验信息存放表

3、SET SESSION TRANSACTIONISOLATION LEVEL REPEATABLE READ

4、查找表的索引列

5、确定分块的第一行,和分块的最后行索引数值

6、查出该块的所有记录,并且做校验,最后插入检验表

7、查出主库校验值和校验行数更新到校验信息表的master_crc, master_cnt列,执行下一个块回到步骤5

8、通过sql命令查出校验表中主从校验不一致的信息。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值