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
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;
|
||
|
|