在网上有好多关于pt-table-checksum和pt-table-sync的文章,详细介绍了工作原理和各个常用参数的详细信息,但是根据别人的贴的命令做测试的时候问题会遇到各种报错,由于公司线上环境经常会出现主从不一致的情况,所以把这些命令整理出来,以方便查阅。(这些命令在测试库上测试过,在线上跑过,目前没有发现问题,如果大家发现有问题的地方请留言,谢谢!)
写在前面:测试的时候主从统一用默认的3306端口,避免从库发现不了的问题
授权一定要到位,从库一定要记得授权
认真看错误提示,弄不清楚状况的时候打开debugPTDEBUG=1
192.168.6.85为主,其它ip为从
h=192.168.6.85,u=checksums,p=checksums 中间一定不能有空格,不然会报错,本人排查这个错误花了很长时间
一:sakila库的film_actor表的数据检测与同步
1,在主库和从库上面添加用户:
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'checksums'@'192.168.6.85' IDENTIFIED BY 'checksums';
2.检测sakila库的film_actor表的数据主从是否一致
PTDEBUG=1 pt-table-checksum --no-check-binlog-format --no-check-replication-filters --recursion-method=processlist --replicate=test.checksums --databases=sakila --tables=film_actor -h 192.168.6.85 -P3306 -u checksums -p checksums
3,根据checksum的结果恢复所有从库的film_actor数据
PTDEBUG=1 pt-table-sync --replicate=test.checksums --recursion-method=processlist --database=sakila --tables=film_actor --port=3306 h=192.168.6.85,u=checksums,p=checksums --print --execute
------------------------------------------------------------------------------------------------------------------------------
二:检测tmp库数据是否一致
pt-table-checksum --no-check-binlog-format --no-check-replication-filters --recursion-method=processlist --replicate=test.checksums --databases=tmp -h 192.168.6.85 -P3306 -u checksums -p checksums
1,根据checksum的结果恢复所有从库的数据
PTDEBUG=1 pt-table-sync --replicate=test.checksums --recursion-method=processlist --no-check-triggers --no-check-child-tables --no-foreign-key-checks --port=3306 h=192.168.6.85,u=checksums,p=checksums --print --execute
(有外键约束要加参数 --no-check-child-tables --no-foreign-key-checks,不然可能把子表所有的数据都删除掉)
(--no-check-triggers,不检测触发器)
2,根据checksum的结果只恢复192.168.6.91的数据
pt-table-sync --print --execute --replicate=test.checksums --sync-to-master h=192.168.6.91,u=checksums,p=checksums
3,恢复从库192.168.6.91的数据(这个从库所有的数据都和主保持一致,除了系统表和checksums表)
pt-table-sync --execute --print --sync-to-master h=192.168.6.91,u=checksums,p=checksums
----------------------------------------------------------------------------------------------------------------------------
执行完pt-table-sync后可再执行一次pt-table-checksum检测主从数据是否一致,可以执行下面的sql语句,如果结果为空则说明主从数据一致
select * from test.checksums where master_cnt<>this_cnt OR master_crc<>this_crc OR ISNULL(master_crc)<>ISNULL(this_crc);
问题总结:
1,在恢复数据的时候有出来过只能恢复部份从库的情况,我的操作方法是把输出的语句保存在一个文本里面,然后直接贴到没有正常恢复的从库去执行。
2,--chunk-size-limit默认设置为2,当遇到行数多的大表时pt-table-checksum可能会跳过不检测,提示:
Skipping table db.table because on the master it would be checksummed in one chunk but on these replicas it has too many rows:
355085 rows on asddb.xxx
The current chunk size limit is 239358 rows (chunk size=119679 * chunk size limit=2.0).
此时可以根据输出的提示将--chunk-size-limit适当调大一点。
本文转自 emma_cql 51CTO博客,原文链接:http://blog.51cto.com/chenql/1708079