You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
4.1 KiB

1 month ago
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;