千家信息网

【Mysql】Mysql GTID复制进程出现异常,出现断点

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,昨天处理了一个MySQL 5.6版本下开启GTID模式复制异常案例,MASTER上的任何操作都无法在SLAVE上应用,SLAVE的RELAY LOG里有记录,但SLAVE的BINLOG却找不到蛛丝马迹
千家信息网最后更新 2024年09月22日【Mysql】Mysql GTID复制进程出现异常,出现断点

昨天处理了一个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 里发现下面这个信息:

此处)折叠或打开

分析:

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

情况1

  1. 正常滴,在MySQL 5.6启用GTID后,部署REPLICATION复制时,可以设定 MASTER_AUTO_POSITION = 1,让 SLAVE 根据 GTID 自动选择适当的事务点进行复制,DBA基本上无需关注和担心主从不一致的问题,还是很让DBA省心的。
  2. 在启用 MASTER_AUTO_POSITION = 1 的情况下,正常是不会发生 GTID 中间有个空隙,产生断点的问题发生。除非是下面这种情况:
  3. 1、人工暂停SLAVE进程;
  4. 2、MASTER上继续写入数据;
  5. 3、MASTER上刷新LOG;
  6. 4、MASTER上删除旧BINLOG,只保留最新的BINLOG;
  7. 5、SLAVE上启动MASTER,这时候会报错,像下面这样:
  8. Last_IO_Errno: 1236
  9. 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.'

  10. 针对这种问题的处理方法可以这么做:
  11. 1、关闭MASTER_AUTO_POSITION,即设置 MASTER_AUTO_POSITION = 0;
  12. 2、手工CHANGE BINLOG FILE & POS;
  13. 这种情况下,不能再次设置 MASTER_AUTO_POSITION = 1,否则还会再次报错。


  1. 情况2
  1. 1、正常配置 REPLICATION 复制,但是设置 MASTER_AUTO_POSITION = 0,也就是人工指定 BINLOG FILE & POS的传统方法;
  2. 2、在复制过程中,暂时关闭 SLAVE 进程;
  3. 3、手工修改 BINLOG FILE & POS 信息,指向新的 BINLOG FILE & POS 点;
  4. 4、启动SLAVE,这时候就会发现 GTID 断点的现象重现了;
  5. 在主从高可用模式下,可能主从间会发生切换,然后再次切换回来,这时候也可能发生上述的断点问题。因此我们建议采用双主来部署高可用切换,基本上可以实现任意来回切换,无需手工指定新的 BINLOG FIEE & POS 信息。
  6. 还有最后一种情况,就是在 MASTER 上执行了 RESET MASTER,导致 MASTER 上的 BINLOG FILE & POS 全部重置,SLAVE 上读取到的信息自然也就不一致了。
  7. 好了,说了那么多,我们最后来说下如何应对处理 GTID 断点的问题。

  8. 方法一:手工修改 BINLOG FILE & POS
  9. 1、关闭SLAVE;
  10. 2、手工CHANGE BINLOG FILE & POS,指向MASTER上最新产生的BINLOG FILE & POS,并且设置 MASTER_AUTO_POSITION = 0;
  11. 3、启动SLAVE;

  1. 方法二:手工修改 GTID_PURGED 值
  2. 1、关闭 SLAVE;
  3. 2、在 SLAVE 上执行 RESET MASTER,重设 SLAVE 上的 BINLOG FILE & POS(如果这个节点用于复制中继,要注意所有binlog是否都被读取完毕,避免数据丢失);
  4. 3、在 SLAVE 上执行 SET @@GLOBAL.GTID_PURGED = '35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455';
  5. 4、启动 SLAVE;
  6. 这种做法比较费解一点,意思是,我们告诉SLAVE要主动抛弃掉 MASTER 上传输过来的某些区间的事务。在这个例子中,我们抛弃了 1-2455 这个区间,也就是在 GTID 从 2466 开始,又会继续应用 RELAY LOG 了,相比我们最开始的那个信息:

  7. Retrieved_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-451
  8. Executed_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455:792490-4517929
  9. 我们强制 SLAVE 只忽略 1-2455 这个区间,从 2466 开始继续复制,消除了本来也会被忽略的区间: 792490-4517929,确保新产生的事务都会被继续应用。这个做法可以参考MySQL手册:Excluding transactions with gtid_purged。

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

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


原文:http://imysql.com/2014/07/31/mysql-faq-exception-replication-with-gtid.shtml
情况 手工 问题 事务 信息 区间 切换 断点 做法 方法 版本 应用 一致 再次 数据 过程 处理 进程 主从 也就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全宣传周工作报告 石林正规软件开发市场价 csgo国服从服务器 服务器的cpu是通过代码计算的 云数据库怎么保障安全性 电力系统网络安全防护备案表 北京微客网络技术有限公司 戴尔服务器连接显示器有几种接口 3月敏感期网络安全简报 软件开发公司的企业文化 武汉大学16网络安全专业 截面数据数据库 电脑mc联机无法连接服务器 阿里云服务器下载速度多少 网络安全审计软件下载 软件开发课程海报配色 计算机软件开发技术职业通道 淄博ios软件开发哪家做的好 网络安全测试工具那个好 广东河源网络安全 ipv6中的网络安全技术 wps模板服务器繁忙 企业网络安全管理如何维护 公务员软件开发岗位要求高吗 上海5g网络技术大学 北京微客网络技术有限公司 中国医疗科技企业互联网医院 all any数据库 初中文化学软件开发有前途吗 莱山区安卓软件开发外包公司
0