工作原理:pt-table-checksum在主上执行检查语句在线检查mysql复制的一致性,生成replace语句,然后通过复制传递到从,再通过update更新master_src的值。通过检测从上this_src和master_src的值从而判断复制是否一致。
注意:使用的时候选择业务地峰的时候运行,因为运行的时候会造成表的部分记录锁定。使用--max-load来指定最大的负载情况,如果达到那个负载这个暂停运行。如果发现有不一致的数据,可以使用pt-table-sync工具来修复。
注意:和1.0版本不同,新版本的pt-table-checksum只需要在master上执行即可。
通过 –explain参数再结合二进制日志就可以看出脚本的工作原理,如我的test库有一个名字为zhang的表,我们通过抓取二进制日志来查看脚本的原理:
REPLACE INTO `test`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT 'test', 'zhang', '1', NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `id`, `name`, CONCAT(ISNULL(`name`)))) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `test`.`zhang` /*checksum table*/;
UPDATE `test`.`checksums` SET chunk_time = '0.000563', master_crc = '31012777', master_cnt = '4' WHERE db = 'test' AND tbl = 'zhang' AND chunk = '1'
从这里可以很明显的看出原理了,前面已经说了,这里就不赘述了。
使用示例:
范例1:比较test数据库同步是否一致,结果显示所有的表。
pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --create-replicate-table --host=192.168.3.135 --port 3306 -uroot -pzhang@123
参数说明:第一次运行的时候需要添加--create-replicate-table参数,如果不加这个就需要手工运行添加表结构的SQL,表结构SQL如下:
CREATE TABLE checksums (
db char(64) NOT NULL,
tb char(64) NOT NULL,
chunk int NOT NULL,
chunk_time float NULL,
chunk_index varchar(200) NULL,
lower_boundary text NULL,
upper_boundary text NULL,
this_crc char(40) NOT NULL,
this_cnt int NOT NULL,
master_crc char(40) NULL,
master_cnt int NULL,
ts timestamp NOT NULL,
PRIMARY KEY (db, tbl, chunk),
INDEX ts_db_tbl (ts, db, tbl)
) ENGINE=InnoDB;
之所以使用--nocheck-replication-filters参数是因为我的my.cnf配置了replicate-ignore-db和replicate-wild-do-table等参数。另外需要特别注意执行的checksums所在的数据库必须是同步的数据库。我刚开始使用的时候摸索的很久,官网也没有范例。呵呵!
结果如下:
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
05-23T16:19:29 0 1 2 1 0 0.006 test.aaa
05-23T16:19:29 0 0 1 1 0 0.017 test.bbb
05-23T16:19:29 0 0 0 1 0 0.007 test.category_part
05-23T16:19:31 0 0 233617 6 0 1.887 test.collect_data
05-23T16:19:34 0 0 250346 5 0 2.709 test.effective_user
05-23T16:19:34 0 1 1 1 0 0.008 test.heartbeat
05-23T16:19:39 0 0 1000000 11 0 5.353 test.oss_pvinfo2
从结果中,我们可以看到test.aaa和test.heartbeat表的DIFFS不为0,那么就是这两个表不同步了。
范例2:比较test数据库同步是否一致,结果只显示数据不一致的表(添加--replicate-check-only参数即可,这个值查看checksums数据不会重新对表进行比较,因此需要先运行上面的比较语句之后再运行这个语句,否则显示不了最新的变化。)。