1:解压 percona-toolkit-3.0.12_x86_64.tar.gz 2:解压目录bin可以直接执行 ./pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --databases=dbmgame,dbmaccount --tables=tbAbyssRecording,tbarena h=192.168.1.17,u=baksync,p=baksync,P=3306 ./pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=percona.alldatabase --create-replicate-table --empty-replicate-table --replicate-check-only h=192.168.1.17,u=baksync,p=baksync,P=3306 #参数 --[no]check-replication-filters:是否检查复制的过滤器,默认是yes,建议启用不检查模式。 --no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。 --replicate-check-only :只显示不同步的信息(只有错误数据才会写表或打印)。 --replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。 --create-replicate-table : 创建指定表,默认是yes --databases=dbmgame,dbmaccount :指定需要被检查的数据库,多个库之间可以用逗号分隔。 --tables=tbAbyssRecording,tbarena :指定需要被检查的表,多个用逗号隔开 h=127.0.0.1 :Master的地址 u=root :用户名 p=123456 :密码 P=3306 :端口 结果 #解释: TS :完成检查的时间。 ERRORS :检查时候发生错误和警告的数量。 DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。 ROWS :表的行数。 CHUNKS :被划分到表中的块的数目。 SKIPPED :由于错误或警告或过大,则跳过块的数目。 TIME :执行的时间。 TABLE :被检查的表名。 //主从一致性错误处理 Last_SQL_Errno: 1032 Last_SQL_Error: Could not execute Delete_rows event on table percona.alldatabase; Can't find record in 'alldatabase', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log binlog.000005, end_log_pos 7444982 gtid: Could not execute Delete_rows event on table test.office_dogs; 2020-05-13 09:56 错误背景 主库执行delete from test.office_dogs; 从库报错 Last_SQL_Errno: 1032 Last_SQL_Error: Could not execute Delete_rows event on table test.office_dogs; Can't find record in 'office_dogs', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000004, end_log_pos 1232 意思是从库找不到记录。原因是某条记录在从库中不存在。 解决方案(一定要找对GTID) gtid有一个重要的特性,已经执行过的gtid,不会在次执行,所以我们可以手工执行此gtid的事务,但是事务里不处理数据,做成一个空事务。 关闭slave的binlog写入 mysql> set sql_log_bin=0; Query OK, 0 rows affected (0.00 sec) 在slave上手工处理数据 mysql> delete from office_dogs; Query OK, 17 rows affected (0.03 sec) 打开slave的binlog写入 mysql> set sql_log_bin=1; Query OK, 0 rows affected (0.00 sec) 在slave上执行show slave status找到出错的gtid值 开始位置 Exec_Master_Log_Pos: 819 文件名和结束位置 Last_SQL_Error: Could not execute Delete_rows event on table test.office_dogs; Can't find record in 'office_dogs', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000004, end_log_pos 1232 在master上执行 mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000004 --start-position=819 --stop-position=1232 找出gtid的值 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 819 #200512 17:29:00 server id 103 end_log_pos 884 CRC32 0xc4c5687e GTID last_committed=2 sequence_number=3 rbr_only=yes /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; SET @@SESSION.GTID_NEXT= '00015632-3333-3333-3333-333333333333:3'/*!*/; # at 884 在slave上执行 set session gtid_next='00015632-3333-3333-3333-333333333333:3'; begin; commit; SET SESSION GTID_NEXT = AUTOMATIC; start slave;