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

到此为止,欢迎指正!

原文地址:https://www.cnblogs.com/lidx/p/9723669.html

时间: 2024-11-05 18:28:32

MySQL 5.7 GTID模式下 skip 1032 Error的相关文章

GTID模式下的replication,跳过错误日志的解决方法

日志错误: 大多数replication错误都是因为日志错误引起的. 主日志和中继日志都可能出错. 评判日志错误的辨别方法: mysqlbinlog  master_binlog_file > /dev/null   屏幕有输出则表示这个binlog有错误,如果没有则表示binlog正常. mysqlbinlog  slave_binlog_file  >/dev/null 跳过日志错误1: 可以使用手动跳过日志错误,可能会造成数据不一致 如果主日志出错,可以再slave上执行(如果有多个错误

关于GTID模式下备份时 --set-gtid-purged=OFF 参数的实验【转】

刚刚听了吴老师是复制章节课程,对于GTID模式下备份数据--set-gtid-purged=OFF 参数有些不理解,于是乎做了实验,加深理解,得出些结论,如有错漏请批评指正! 部分备份: [[email protected] mysql]# /usr/local/mysql/bin/mysqldump -uroot -p -S /data/mysql3306/data/mysql3306.sock lyh2 >/home/backup/lyh2-3306-`date +%Y%d%m`.sql E

mysql在线开启GTID模式

1.要求: (1)必须是5.7.6版本以上的mysql (2)GTID状态为OFF 2.开启步骤: (1):SET GLOBAL ENFORCE_GTID_CONSISTENCY = 'WARN'; (2):SET GLOBAL ENFORCE_GTID_CONSISTENCY = 'ON'; (3):SET GLOBAL GTID_MODE = 'OFF_PERMISSIVE'; (4):SET GLOBAL GTID_MODE = 'ON_PERMISSIVE'; (5):SET GLOBA

不停应用服务,在线建立或重做mysql主从复制的案例,包含一般模式和GTID模式

mysql主从嘛,绝大多数公司都有用到,GTID发展到现在也是越来越多人用,停止应用服务来做主从,略显low了,现在都流行在线做,不影响业务,多实际是吧,不啰嗦了,现在就来看看案例. 先说明,案例分两种方案,实现的意义是一样的,一种是mysqldump方式,一种是xtrabackup方式,视乎实际情况,因为有些业务不一定能用xtrabackup的. 先说mysqldump方式, 因为mysql自带,不需要再做些什么,比较方便易用,不过需要强调一下,数据量太大的话,mysqldump就略显不足了,

MySQL MHA--故障切换模式(GTID模式和非GTID模式)

GTID和非GTID故障切换模式选择 MySQL 5.6版本引入GTID来解决主从切换时BINLOG位置点难定位的问题,MHA从0.56版本开始支持基于GTID的复制,在切换时可以采用GTID模式和非GTID模式两种模式进行切换,如何在发生故障切换时如何判断采用哪种切换方式呢? 在MHA/MasterFailover.pm的do_master_failover方法中定义了"主库宕机"情况下的故障切换流程,其中第一步就是检查配置文件和确定故障切换模式 相关代码: my ( $server

mysql之 MySQL 主从基于 GTID 复制原理概述

一. 什么是GTID ( Global transaction identifiers ):MySQL-5.6.2开始支持,MySQL-5.6.10后完善,GTID 分成两部分,一部分是服务的UUid,UUID保存在mysql数据目录的auto.cnf文件中,这是一个非常重要的文件,不能删除,这一部分是不会变的.另外一部分就是事务ID了,随着事务的增加,值一次递增,如下图+---------------+----------+--------------+------------------+-

MySQL 半同步复制模式说明及配置示例 - 运维小结

MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失. 异步模式是一种基于偏移量的主从复制,实现原理是: 主库开启binlog功能并授权从库连接主库,从库通过cha

在线修改GTID模式

在线修改GTID模式 1. 在每一台机器上执行命令 SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN; 这是很重要的一步,必须确保服务器上没有违反GTID规范的SQL,否则当设置为GTID模式后, 这些业务SQL会被拒绝执行,建议设置上面变量值间隔一天后errorLog没有警告,才可进行下一步. 2. 在每一台服务器上执行 SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON; 上面参数表示GTID模式下一些SQL会被拒绝执

MySQL 解密 --> 如何查看二进制日志ROW模式下最原始的SQL语句

MySQL的binlog的ROW模式解析          在mysql5.6以后,对主从数据一致性要求变高了,statement格式逐渐不太适合业务的需求了,所以生产环境大家都采用了row模式,row模式是传输最底层的数据变化的insert的模块来进行主从数据的传输,那么在binlog里面就和普通的statement模式有何差别?能否看到最原始的sql语句呢? 1.准备录入数据 mysql> create table test1(id int,c1 varchar(20),type int,a