MySQL 5.7 GTID模式下 skip 1032 Error

Posted LIDX BLOG

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 5.7 GTID模式下 skip 1032 Error相关的知识,希望对你有一定的参考价值。

一个偶然的事情,线上一部mysql slave 被人误删了数据,然后又在 master上执行了同样的 delete 操作,导致从库报了1032错误。

其实这种情况下,如果能将缺少的记录重新insert 进去,再 start slave就可以完美解决;

问题在于不知道他具体操作了什么数据,所以想直接跳过这个事务。

脑海里回想了下GTID模式下跳过1032 的步骤,大概步骤是:

mysql> SET @@SESSION.GTID_NEXT= \'4ab8feff-5272-11e8-9320-08002715584a:201840\';
Query OK, 0 rows affected (0.04 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)

mysql> SET GTID_NEXT=\'AUTOMATIC\';
Query OK, 0 rows affected (0.00 sec)

就能解决问题。

问题的关键是如何定位SESSION.GTID_NEXT,由于时隔久远记不太清,于是顺手Google 了一把,没想到结果令人大跌眼镜。

竟然不止一个人说是直接看 Retrieved_Gtid_Set 接收的最后一个GTID 号:

我们回顾一下这两个指标的含义:

Retrieved_Gtid_Set: 表示 从库IO进程从主库已经接收到的事务的GTID集合。
Executed_Gtid_Set:表示 已经在从库上执行的事务的GTID集合。

已正常的思维思考一下,或许Executed_Gtid_Set更有参考意义?答案是NO。

这里我们需要关注的是从库报 1032 时, Relay_Master_Log_File 和 Exec_Master_Log_Pos 处在什么位置,这里才是从库真正卡住的位置

 

显而易见,这些事务都是来自于主库,所以我们应该去主库上的binlog 找到对应的事务的 GTID

mysqlbinlog --start-position=2102  -vv --base64-output=DECODE-ROWS  mybinlog.000010 >binlog-10.sql

看这里:

在2102 这个位置紧跟其后指定下一个事务的GTID:

SET @@SESSION.GTID_NEXT= \'803ee8b1-af67-11e8-be2b-000c29ef4329:643\'/*!*/;

 

那下一个事务是什么呢?

就是从 begin 到 commit 中间的语句,而二这个语句正是在主库删除记录的语句。

 

正是我们应该跳过的事务,所以正确的姿势是:

mysql> SET @@SESSION.GTID_NEXT= \'803ee8b1-af67-11e8-be2b-000c29ef4329:643\';

mysql> BEGIN;

mysql> COMMIT;

mysql> SET GTID_NEXT=\'AUTOMATIC\';

 

到此为止,欢迎指正!

以上是关于MySQL 5.7 GTID模式下 skip 1032 Error的主要内容,如果未能解决你的问题,请参考以下文章

mysql 5.7多源复制如何去掉一个复制源

mysql5.7使用gtid模式搭建主从复制架构

mysql 5.7 主从同步 gtid

MAC 下 Mysql 5.7 的配置文件在哪

切换-5.7-GTID复制切换成传统复制

MySQL 5.7基于GTID及多线程主从复制