昨天处理了一个MySQL 5.6版本下开启GTID模式复制异常案例,MASTER上的任何操作都无法在SLAVE上应用,SLAVE的RELAY LOG里有记录,但SLAVE的BINLOG却找不到蛛丝马迹。由于开启了GTID,所以排查起来也简单,只需要在SLAVE上把RELAY LOG和BINLOG分别解析成文本文件,再直接搜索MASTER的UUID,就能找到SLAVE上是否应用了MASTER复制过来的事务。 排查过程中,曾经一度怀疑是因为设置了BINLOG-DO或者IGNORE规则,或者设置了REPLICATION-DO或IGNORE规则,甚至是GTID的严重BUG,但都没发现端倪。直到从 SHOW SLAVE STATUS 里发现下面这个信息:

[yejr@imysql.com]> show slave statusG
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send event
...
<strong>              Master_Log_File: mysql-bin.000001</strong>
<strong>          Read_Master_Log_Pos: 2539</strong>Relay_Log_File: mysql-relay-bin.000003Relay_Log_Pos: 1996
<strong>        Relay_Master_Log_File: mysql-bin.000001</strong>Slave_IO_Running: YesSlave_SQL_Running: Yes
# 两个线程工作正常Replicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:
#没设置任何规则Last_Errno: 0Last_Error:Skip_Counter: 0
<strong>          Exec_Master_Log_Pos: 2539
</strong># 无论binlog file 还是 pos,都和MASTER保持一致,也就是说BINLOG的接收和RELAYR LOG的APPLY都很正常,有条不紊工作着Relay_Log_Space: 2778Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0
...Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:
# 没设置忽略某些 server-id 上的BINLOGMaster_Server_Id: 123315Master_UUID: 35cc99c6-0297-11e4-9916-782bcb2c9453Master_Info_File: /data/db11_3316/master.info
<strong>                    SQL_Delay: 0
</strong># 没有设置复制延迟策略          SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update itMaster_Retry_Count: 4294967295Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-451
<strong>            Executed_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455:792490-4517929
</strong>                Auto_Position: 1

从上面的日志发现什么了没?尤其是这两行:

           Retrieved_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-451
<strong>            Executed_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455:792490-4517929
</strong>                Auto_Position: 1

这下有点明白了吧,意思是:

1、SLAVE从MASTER上复制了GTID范围是:1-451;
2、SLAVE上执行GTID的范围氛围两段,一段是:1-2455,另一段是:792490-4517929;

尼玛,不应该是连续的嘛,怎么会这么奇葩⊙﹏⊙b,这可如何是好呀,好捉急~~~ 莫急,且容我们慢慢分析为啥GTID从MASTER到SLAVE之后发生了断点,产生了间隙。

正常滴,在MySQL 5.6启用GTID后,部署REPLICATION复制时,可以设定 MASTER_AUTO_POSITION = 1,让 SLAVE 根据 GTID 自动选择适当的事务点进行复制,DBA基本上无需关注和担心主从不一致的问题,还是很让DBA省心的。 在启用 MASTER_AUTO_POSITION = 1 的情况下,正常是不会发生 GTID 中间有个空隙,产生断点的问题发生。除非是下面这种情况:

1、人工暂停SLAVE进程;
2、MASTER上继续写入数据;
3、MASTER上刷新LOG;
4、MASTER上删除旧BINLOG,只保留最新的BINLOG;
5、SLAVE上启动MASTER,这时候会报错,像下面这样:
Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.'

针对这种问题的处理方法可以这么做:

1、关闭MASTER_AUTO_POSITION,即设置 MASTER_AUTO_POSITION = 0;
2、手工CHANGE BINLOG FILE & POS;

这种情况下,不能再次设置 MASTER_AUTO_POSITION = 1,否则还会再次报错。 还有一种情况会发生 GTID 间隙断点问题,例如这样:

1、正常配置 REPLICATION 复制,但是设置 MASTER_AUTO_POSITION = 0,也就是人工指定 BINLOG FILE & POS的传统方法;
2、在复制过程中,暂时关闭 SLAVE 进程;
3、手工修改 BINLOG FILE & POS 信息,指向新的 BINLOG FILE & POS 点;
4、启动SLAVE,这时候就会发现 GTID 断点的现象重现了;

在主从高可用模式下,可能主从间会发生切换,然后再次切换回来,这时候也可能发生上述的断点问题。因此我们建议采用双主来部署高可用切换,基本上可以实现任意来回切换,无需手工指定新的 BINLOG FIEE & POS 信息。

还有最后一种情况,就是在 MASTER 上执行了 RESET MASTER,导致 MASTER 上的 BINLOG FILE & POS 全部重置,SLAVE 上读取到的信息自然也就不一致了。

好了,说了那么多,我们最后来说下如何应对处理 GTID 断点的问题。

方法一:手工修改 BINLOG FILE & POS

1、关闭SLAVE;
2、手工CHANGE BINLOG FILE & POS,指向MASTER上最新产生的BINLOG FILE & POS,并且设置 MASTER_AUTO_POSITION = 0;
3、启动SLAVE;

方法二:手工修改 GTID_PURGED 值

1、关闭 SLAVE;
2、在 SLAVE 上执行 RESET MASTER,重设 SLAVE 上的 BINLOG FILE & POS;
3、在 SLAVE 上执行 SET @@GLOBAL.GTID_PURGED = '35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455';
4、启动 SLAVE;

这种做法比较费解一点,意思是,我们告诉SLAVE要主动抛弃掉 MASTER 上传输过来的某些区间的事务。在这个例子中,我们抛弃了 1-2455 这个区间,也就是在 GTID 从 2466 开始,又会继续应用 RELAY LOG 了,相比我们最开始的那个信息:

           Retrieved_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-451
<strong>            Executed_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455:792490-4517929</strong>

我们强制 SLAVE 只忽略 1-2455 这个区间,从 2466 开始继续复制,消除了本来也会被忽略的区间: 792490-4517929,确保新产生的事务都会被继续应用。这个做法可以参考MySQL手册:Excluding transactions with gtid_purged。

还有另外一种费力不讨好的做法,就是在 MASTER 上执行一些没用的空事务,使得 GTID 的序号一直在加大,直到超过 2555 为止,然后在 792490-4517929 这个区间依法炮制一番,但我们非常不推荐采用这种做法,既麻烦又容易误操作。 说了这么多,在 MySQL 5.6及以上版本中,我们强烈建议启用 MASTER_AUTO_POSITION = 1,让 MySQL 自己去做判断,减少一些不必要的问题,并且采用双主(其中一个主设为只读)的方式,方便两个主之间可以随意相互切换,而不必担心数据不一致。

上面过程我采用的MySQL版本:5.6.17-65.0-rel65.0-log Percona Server with XtraDB (GPL), Release rel65.0, Revision 587,实际案例发生的MySQL版本当时忘了记录了,但肯定也是5.6以上的啦,哈哈~~~

MySQL 5.6版本GTID复制异常处理一例相关推荐

  1. 5.6版本GTID复制异常处理一例(转)

    http://imysql.com/2014/07/31/mysql-faq-exception-replication-with-gtid.shtml 昨天处理了一个MySQL 5.6版本下开启GT ...

  2. mysql gitd 数据结构同步失败_Mysql5.7版本Gtid复制出现不同步的情况

    Mysql5.7版本,Gtid复制出现不同步的情况: 问题:由于shell检测Mysql从库状态 : Slave_IO_Running: Yes Slave_SQL_Running: Yes 一直都为 ...

  3. mysql 5.6 之 GTID 复制介绍

    mysql 5.6 的新特性: MySQL 5.6 包含了一个复制的新功能,enabling DevOps teams to reliably scale-out their MySQL infras ...

  4. mysql 基于gtid复制_深入MySQL复制(二):基于GTID复制

    相比传统的MySQL复制,gtid复制无论是配置还是维护都要轻松的多.本文对gtid复制稍作介绍. 1.gtid基本概念 传统的基于binlog position复制的方式有个严重的缺点:如果slav ...

  5. mysql主从(GTID复制模式)

    环境准备 主数据库:CentOS7    MySQL8.0    192.168.10.6    keepalived 从数据库:CentOS7    MySQL8.0    192.168.10.7 ...

  6. mysql gtid 搭建主从_MySQL5.7 - 基于GTID复制模式搭建主从复制

    MySQL5.7 - 基于GTID复制模式搭建主从复制 发布时间:2020-04-17 10:09:20 来源:51CTO 阅读:226 作者:insist_way 环境: MySQL5.7.24版本 ...

  7. mysql之 mysql 5.6不停机主从搭建(一主一从基于GTID复制)

    环境说明: 版本 version 5.6.25-log 主库ip: 10.219.24.25 从库ip:10.219.24.22 os 版本: centos 6.7 已安装热备软件:xtrabacku ...

  8. mysql gtid 5.7_MySQL5.7之GTID复制

    MySQL之GTID复制 一.GTID复制介绍 GTID(Global Transaction ID)是对于一个已提交事务的唯一编号,并且是一个全局(主从复制)唯一的编号. 它的官方定义如下: GTI ...

  9. mysql主从复制gtid_详解MySQL主从复制实战 - 基于GTID的复制

    基于GTID的复制 简介 基于GTID的复制是MySQL 5.6后新增的复制方式. GTID (global transaction identifier) 即全局事务ID, 保证了在每个在主库上提交 ...

最新文章

  1. Numpy.genfromtxt
  2. 最近24小时记录:虚拟机与Wireshark 2.0
  3. MySql 隐式转换
  4. 002-请你回答一下单元测试、集成测试、系统测试、验收测试、回归测试这几步中最重要的是哪一步...
  5. linux系统下codeblocks控制台打印中文乱码
  6. Outlook2016怎么修改默认数据库
  7. 数据预处理-数据变换-连续属性离散化实现:pandas(0.23)+sklearn(0.19.1)+matplotlib(2.2.2)
  8. vue对象深拷贝_JS 对象的深拷贝和浅拷贝
  9. 毕业设计——第三章 开发方法及系统实现(6)(完结)
  10. ai跟随路径_AI机器人掌勺 马桥豆腐干飘香,长三角文博会上的这些“马桥元素”大放异彩...
  11. Atitit 单项功能开发 最佳实践规范 标准化流程attilax总结.docx
  12. TLS1.3---密钥的计算
  13. GJB 5000B-2021下载-见文章结尾
  14. 以码为梦,心向远方,路在脚下|211应届计算机毕业生的迷茫
  15. 【数据结构】经典习题
  16. 华为双系统手机可以刷成单系统_华为手机双系统,1部手机能当2部用,打开3秒就能切换,真厉害...
  17. APS高级计划排程 基本概念
  18. 视频教程-PHP零基础七天入门视频课程(免费50章)-PHP
  19. 显示空间——字符显示之矢量文字
  20. 把握云计算+引领云时代

热门文章

  1. 高起专计算机应用基础试题及答案,重庆大学网络教育高起专计算机应用基础入学考试模拟题及答案(二)...
  2. 合并数组:双针模型,原地实现
  3. vue - blog开发学习1
  4. 分类与监督学习,朴素贝叶斯分类算法
  5. Oracle数据库的视图
  6. 【机器学习】粗糙集属性约简—Attribute Reduction
  7. BZOJ 1432 [ZJOI2009]Function
  8. 编程的智慧 意外在内网找到的资源
  9. 这个帖子要收藏,以后用得着--python 实时获取子进程输出
  10. centos 6.5 安装 redis