学习技术需要掌握
作用、原理、安装步骤、工具使用、模拟演示、注意细节、优点缺点
一、 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命令查出校验表中主从校验不一致的信息。