昨天处理了一个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. [yejr@imysql.com]> show slave status\G
  2. *************************** 1. row ***************************
  3. Slave_IO_State: Waiting for master to send event
  4. ... Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 2539 Relay_Log_File: mysql-relay-bin.000003
  5. Relay_Log_Pos: 1996 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes
  6. Slave_SQL_Running: Yes
  7. # 两个线程工作正常
  8. Replicate_Do_DB:
  9. Replicate_Ignore_DB:
  10. Replicate_Do_Table:
  11. Replicate_Ignore_Table:
  12. Replicate_Wild_Do_Table:
  13. Replicate_Wild_Ignore_Table:
  14. #没设置任何规则
  15. Last_Errno: 0
  16. Last_Error:
  17. Skip_Counter: 0
  18. Exec_Master_Log_Pos: 2539 # 无论binlog file 还是 pos,都和MASTER保持一致,也就是说BINLOG的接收和RELAYR LOG的APPLY都很正常,有条不紊工作着
  19. Relay_Log_Space: 2778
  20. Until_Condition: None
  21. Until_Log_File:
  22. Until_Log_Pos: 0
  23. ...
  24. Seconds_Behind_Master: 0
  25. Master_SSL_Verify_Server_Cert: No
  26. Last_IO_Errno: 0
  27. Last_IO_Error:
  28. Last_SQL_Errno: 0
  29. Last_SQL_Error:
  30. Replicate_Ignore_Server_Ids:
  31. # 没设置忽略某些 server-id 上的BINLOG
  32. Master_Server_Id: 123315
  33. Master_UUID: 35cc99c6-0297-11e4-9916-782bcb2c9453
  34. Master_Info_File: /data/db11_3316/master.info
  35. SQL_Delay: 0 # 没有设置复制延迟策略
  36. SQL_Remaining_Delay: NULL
  37. Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
  38. Master_Retry_Count: 4294967295
  39. Master_Bind:
  40. Last_IO_Error_Timestamp:
  41. Last_SQL_Error_Timestamp:
  42. Master_SSL_Crl:
  43. Master_SSL_Crlpath:
  44. Retrieved_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-451
  45. Executed_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455:792490-4517929 Auto_Position: 1

从上面的日志发现什么了没?尤其是这两行点击(此处)折叠或打开
  1. Retrieved_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-4517929
  2. Executed_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455:792490-4517929 Auto_Position: 1

这下有点明白了吧,意思是
1、SLAVE从MASTER上复制了GTID范围是:1-4517929;
2、SLAVE上执行GTID的范围分为两段,一段是:1-2455,另一段是:792490-4517929;

分析:

  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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29096438/viewspace-2054962/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29096438/viewspace-2054962/

【Mysql】Mysql GTID复制进程出现异常,出现断点相关推荐

  1. MySQL的GTID复制与传统复制的相互切换

    MySQL的GTID复制与传统复制的相互转换 1. GTID复制转换成传统复制 1.1 环境准备 1.2 停止slave 1.3 查看当前主从状态 1.4 change master 1.5 启动主从 ...

  2. mysql innodbdatahomedir_mysql gtid复制

    ====================配置如下====================[client] port= 3306socket=/tmp/my3306.sock [mysql] no-au ...

  3. Mysql基于GTID复制模式-运维小结 (完整篇)

    先来看mysql5.6主从同步操作时遇到的一个报错: mysql> change master to master_host='192.168.10.59',master_user='repli ...

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

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

  5. mysql数据库基于gtid复制,mysql基于gtid复制的错误解决

    1.错误描述 Last_SQL_Errno: 1032 Last_SQL_Error: Coordinator stopped because there were error(s) in the w ...

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

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

  7. mysql gtid复制优缺点_MySQL GTID复制

    备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL 的主从GTID复制 Table of Contents 概述 GTID复制又叫全局事物ID(global transacti ...

  8. MySQL多源复制【转】

    什么是多源复制? 首先,我们需要清楚 multi-master 与multi-source 复制不是一样的. Multi-Master 复制通常是环形复制, 你可以在任意主机上将数据复制给其他主机. ...

  9. Oracle查看ogg延时,OGG复制进程延迟不断增长

    集团某在线系统使用OGG做了同步复制用于二期业务生产使用.有同事过来说复制进程有点异常 -bash-3.2$ ogg Oracle GoldenGate Command Interpreter for ...

最新文章

  1. 数据库MYSQL学习系列一
  2. 大学计算机系学生,大学计算机专业学生自我介绍
  3. java ee jstl_Java EE之JSTL(下)
  4. OSTimeGet()--获取当前时间
  5. 为SQL Server Always On可用性组配置故障转移群集,存储控制器和仲裁配置
  6. 微软更新服务器ip地址,微软承认Windows 10更新导致路由等本地IP地址打不开
  7. 微信小程序之实现隔行变色表格
  8. 第2章 变量、数据类型、运算符
  9. gmx_MMPBSA.py的安装及使用--只翻译部分内容,具体可参考官方文档(https://valdes-tresanco-ms.github.io/gmx_MMPBSA/dev/)
  10. xshell 批量创建.xsh会话文件
  11. HarmonyOS resources目录中“限定词目录”命名要求
  12. 读书笔记-架构整洁之道有感
  13. 土包子也来爆料一下贵族的生活:高尔夫球场见闻
  14. 论智能问答中的对抗攻击及防御策略
  15. Array 属性和方法
  16. Kafka3.0.0单机安装及简单使用
  17. (侯捷C++)1.2面向对象高级编程(上)
  18. tomcat的宏观架构
  19. Android 使用 sqlcipher 加密数据库
  20. 时间序列:对股价时序建模

热门文章

  1. 基于LayUI使用FullCalendar实现日程管理
  2. 模拟手柄控制器点击没有反应的问题
  3. UNIX再学习 -- ps、top、kill 指令
  4. 10首现代诗歌欣赏:什么是孤独
  5. 2008¸ß¿¼×÷ÎĸãЦ¼¯
  6. 月是故乡明,每逢佳节倍思亲,近乡情更怯
  7. java培训机构那个好点
  8. excel单元格斜线_含金量100%的9个Excel函数公式,全部100%掌握的都是超级高手!...
  9. 自然语言处理(三):传统RNN(NvsN,Nvs1,1vsN,NvsM)pytorch代码解析
  10. 情人节如何表达你的“心”