版本:pt-table-checksum 2.1.5,pt-table-sync 2.1.5
pt-table-checksum与pt-table-sync 这两个工具是双胞胎。pt-table-checksum用来检测主从表数据同步情况。pt-table-sync 就用来对不同步的表数据进行同步。并且,pt-table-sync可以使用到pt-table-checksum执行得到的结果。
1 . pt-table-checksum 将检查结果写入一张表checksum中,再比较字段 this_crc 与master_cnt的值是否不同。最后输出最终结果如下,DIFFS 显示不为0的就是数据不同步的表。
[root@analyse ~]# pt-table-checksum --nocheck-replication-filters --replicate=pango_test.checksums --databases=pango_test h=192.168.10.21,u=dump,p=XXXX
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
10-18T15:58:40 0 0 4 1 0 0.123 pango_test.CLIENT_DICTIONARY
10-18T15:58:40 0 0 348 4 0 0.203 pango_test.DAILY_DATA
10-18T15:58:40 0 0 1414 1 0 0.068 pango_test.DATA_TIDY
10-18T15:58:40 0 0 601 1 0 0.067 pango_test.DREAMER_USE_COUNT
--nocheck-replication-filters 是因为我在my.cnf中指定了同步数据库名。--replicate指定表checksums , --databases指定检查哪个数据库同步情况。如果检查多个,用逗号隔开。如果需要指定检查哪个表,加--tables。--replicate-check-only只会打印不同步的表。
注意 1:根据我的测试,需要一个超牛的账号,既能登陆主库,也能登陆从库,而且还能同步数据。2:只能指定一个host,且必须为主库的IP。3:在检查时会向表加S锁。4:运行之前需要从库IO,SQL线程是YES状态。
2. pt-table-sync 既可以同步单个表数据,也可以同步整个库。但不会创建表,所以事先从库得有这个库和这个表。Usage: pt-table-sync [OPTION...] DSN [DSN...]
例:pt-table-sync --replicate=pango_test.checksums h=192.168.10.21,u=dump,p=XXX h=192.168.10.22,u=root,p=XXX --print
REPLACE INTO `pango_test`.`test1`(`id`, `user_name`, `password`, `name`) VALUES ('8', 'admin8', '123', 'Administrator8') /*percona-toolkit src_db:pango_test src_tbl:test1 src_dsn:h=192.168.10.21,p=...,u=dump dst_db:pango_test dst_tbl:test1 dst_dsn:h=192.168.10.22,p=...,u=dump lock:1 transaction:1 changing_src:pango_test.checksums replicate:pango_test.checksums bidirectional:0 pid:31773 user:root host:analyse.rzw.com*/;
REPLACE INTO `pango_test`.`test1`(`id`, `user_name`, `password`, `name`) VALUES ('9', 'admin9', '1222', 'Administrator9') /*percona-toolkit src_db:pango_test src_tbl:test1 src_dsn:h=192.168.10.21,p=...,u=dump dst_db:pango_test dst_tbl:test1 dst_dsn:h=192.168.10.22,p=...,u=dump lock:1 transaction:1 changing_src:pango_test.checksums replicate:pango_test.checksums bidirectional:0 pid:31773 user:root host:analyse.rzw.com*/;
REPLACE INTO `pango_test`.`test2`(`id`, `user_name`, `password`, `name`) VALUES ('8', 'admin8', '123', 'Administrator8') /*percona-toolkit src_db:pango_test src_tbl:test2 src_dsn:h=192.168.10.21,p=...,u=dump dst_db:pango_test dst_tbl:test2 dst_dsn:h=192.168.10.22,p=...,u=dump lock:1 transaction:1 changing_src:pango_test.checksums replicate:pango_test.checksums bidirectional:0 pid:31773 user:root host:analyse.rzw.com*/;
REPLACE INTO `pango_test`.`test2`(`id`, `user_name`, `password`, `name`) VALUES ('9', 'admin9', '1222', 'Administrator9') /*percona-toolkit src_db:pango_test src_tbl:test2 src_dsn:h=192.168.10.21,p=...,u=dump dst_db:pango_test dst_tbl:test2 dst_dsn:h=192.168.10.22,p=...,u=dump lock:1 transaction:1 changing_src:pango_test.checksums replicate:pango_test.checksums bidirectional:0 pid:31773 user:root host:analyse.rzw.com*/;
例子是使用了之前运行pt-table-checksum得到的表checksums。开头说这两个是双胞胎,就是这么回事。先运行pt-table-checksum检查不同步的表,接着运行pt-table-sync,利用刚才得到的不同步表,进行同步数据。如果指定了--replicate,那么pt-table-sync就只会利用已经存在的checksum表中的数据,不会再次检查,所以为了确保正确,请在运行pt-table-sync之前运行pt-table-checksum以便得到最新checksum结果。--print是打印要执行的SQL,但不执行。这样可以事先查看会有哪些更改。
注意:前一个DSN “ h=192.168.10.21,u=dump,p=XXX” 指向主表,后一个DSN “h=192.168.10.22,u=root,p=XXX ” 指向从表。