Percona Toolkit使用教程之复制类工具(2)

工作原理: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数据不会重新对表进行比较,因此需要先运行上面的比较语句之后再运行这个语句,否则显示不了最新的变化。)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/18526.html