mk-table-sync 有效保证表一致的工具,不必重载从表而能够保证一致。

上篇文章说过,当发生主从表数据不一致时,我们就要对此处理,可以导出和导入,但更便捷的方法就是利用mk-table-sync这个工具。下面来演示下怎么使用。

你需要下载maatkit-7540.tar.gz的工具包。

然后依次
# perl Makefile.PL
# make
# make install

主库master:192.168.8.23
从库slave:  192.168.8.22

我们在从库上运行

[root@vm01 ~]# mk-table-sync --execute --print --no-check-slave --databases test h=192.168.8.23,u=admin,p=123456 h=192.168.8.22,u=admin,p=123456
DELETE FROM `test`.`heartbeat` WHERE `server_id`='11' LIMIT 1 /*maatkit src_db:test src_tbl:heartbeat src_dsn:h=192.168.8.23,p=...,u=admin dst_db:test dst_tbl:heartbeat dst_dsn:h=192.168.8.22,p=...,u=admin lock:0 transaction:0 changing_src:0 replicate:0 bidirectional:0 pid:4176 user:root host:vm01*/;
DELETE FROM `test`.`t1` WHERE `id`='22' LIMIT 1 /*maatkit src_db:test src_tbl:t1 src_dsn:h=192.168.8.23,p=...,u=admin dst_db:test dst_tbl:t1 dst_dsn:h=192.168.8.22,p=...,u=admin lock:0 transaction:1 changing_src:0 replicate:0 bidirectional:0 pid:4176 user:root host:vm01*/;
INSERT INTO `test`.`t1`(`id`) VALUES ('2') /*maatkit src_db:test src_tbl:t1 src_dsn:h=192.168.8.23,p=...,u=admin dst_db:test dst_tbl:t1 dst_dsn:h=192.168.8.22,p=...,u=admin lock:0 transaction:1 changing_src:0 replicate:0 bidirectional:0 pid:4176 user:root host:vm01*/;
[root@vm01 ~]#

这里要说明一下,--no-check-slave这个参数,如果你不加这个参数,会提示报错,因为这个工具默认是不允许在从库上修改数据的,但我们这里为了不在主库上dump出来,再到从库上导入进去,加了这个参数。

它的工作原理是:先一行一行检查主从库的表是否一样,如果哪里不一样,就执行删除,更新,插入等操作,使其达到一致。

这时,我们在检查下主从表的完整性、一致性

在主库上运行

[root@vm02 ~]# mk-table-checksum h=localhost,u=root,p=123456 h=192.168.8.22,u=admin,p=123456 -d test
DATABASE TABLE     CHUNK HOST         ENGINE      COUNT         CHECKSUM TIME WAIT STAT  LAG
test     heartbeat     0 localhost    MyISAM       NULL       3258230607    0    0 NULL NULL
test     heartbeat     0 192.168.8.22 MyISAM       NULL       3258230607    0    0 NULL NULL
test     t1            0 localhost    InnoDB       NULL       1245381782    0    0 NULL NULL
test     t1            0 192.168.8.22 InnoDB       NULL       1245381782    0    0 NULL NULL
test     t2            0 localhost    InnoDB       NULL        251493421    0    0 NULL NULL
test     t2            0 192.168.8.22 InnoDB       NULL        251493421    0    0 NULL NULL
[root@vm02 ~]#
[root@vm02 ~]# mk-table-checksum h=localhost,u=root,p=123456 h=192.168.8.22,u=admin,p=123456 -d test | mk-checksum-filter
[root@vm02 ~]#

可以看到,主从库的表数据已经完全一样了。