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 ~]#
可以看到,主从库的表数据已经完全一样了。