mysql解决主从不一致简单小示例

时间:2022-09-22 18:43:46

现有数据:

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检查主从一致性