现有数据:
Master和slave上的dba.t1表都有3条数据:
mysql> select * from t1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
模拟主从不一致
在slave上新增数据id=4,然后在master上新增数据id=4,然后查询slave状态,能看到错误:
Last_SQL_Error: Could not execute Write_rows event on table dba.t1; Duplicate entry '4' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000003, end_log_pos 1458
Slave_SQL_Running:变成了No
此后,在master上再插入新的数据,如id为5,6等数据,在slave上也无法查询到了。
所以需要在slave上删除这条数据。删除之后,start slave sql_thread。新增的id为5,6等数据就会被自动同步过来了。
现在假设master上还是只有1,2,3三条数据,slave上有1,2,3,4四条数据。
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=dba.checksums --databases=dba --tables=t1 h=localhost,u=root,p=123,P=3307,S=/tmp/mysql.sock
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
03-25T17:34:20 0 1 3 1 0 0.279 dba.t1
pt-table-sync --replicate=dba.checksums h=localhost,u=root,p=system@123 h=192.168.1.22,u=root,p=123 --port 3307 --print
[root@PC percona-toolkit-2.2.13]# pt-table-sync --replicate=dba.checksums h=localhost,u=root,p=system@123,S=/tmp/mysql.sock h=192.168.1.22,u=root,p=system@123 --port 3307 --print
DELETE FROM `dba`.`t1` WHERE `id`='4' LIMIT 1 /*percona-toolkit src_db:dba src_tbl:t1 src_dsn:P=3307,S=/tmp/mysql.sock,h=localhost,p=...,u=root dst_db:dba dst_tbl:t1 dst_dsn:P=3307,S=/tmp/mysql.sock,h=192.168.1.22,p=...,u=root lock:1 transaction:1 changing_src:dba.checksums replicate:dba.checksums bidirectional:0 pid:1728 user:root host:PC*/;
将生成的语句在slave上执行一下即可。
注意:当sql进程状态为no时,使用pt-table-checksum命令无法检测一致性,一直显示:
Waiting for the --replicate table to replicate to PC...
Waiting for the --replicate table to replicate to PC...
所以需要解决相应的错误,启动sql进程后,才能使用percona toolkit.
--percona toolkit的pt-table-checksum与pt-table-sync具体介绍请参考:percona-toolkit检查主从一致性