MySQL案例-GTID同步失败:master has purged binary logs

简介: GTID工具联动:http://blog.itpub.net/29510932/viewspace-1736132/ ---------------------------------------------------------------------------...
GTID工具联动:http://blog.itpub.net/29510932/viewspace-1736132/
-------------------------------------------------------------------------------------------------正文---------------------------------------------------------------------------------------------------------------

场景:
MySQL-5.7.12, 开启GTID, M1和M2双主同步, S1从库, RC隔离级别
背景:
因为网络波动导致S1的Master从M1切换到了M2, 切换过去以后同步失败, 报错信息如下:
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.'

分析:
从报错信息上很明显能看出是M2主库purge掉了S1从库还没有receive的事务, 所以报错了;

着手处理:
不过印象中这个业务库本身应该是没什么业务流量的, 不至于需要purge掉binlog;
遂登录主库M2看一下:
binlog日志都在.......


那么就很奇怪了....M2的binlog没有purge过, 为什么会报这个ER_MASTER_HAS_PURGED_REQUIRED_GTIDS的错误呢?
考虑到时间紧迫, 临时用log_file和position的方式恢复了M2与S1的同步;

确认没有再出现问题以后, google+翻了一下源代码;

根据关键字ER_MASTER_HAS_PURGED_REQUIRED_GTIDS找到~/mysql/sql/rpl_binlog_sender.cc的第744行,

点击(此处)折叠或打开

  1. if (!gtid_state->get_lost_gtids()->is_subset(m_exclude_gtid))
  2.     {
  3.       errmsg= ER(ER_MASTER_HAS_PURGED_REQUIRED_GTIDS);
  4.       global_sid_lock->unlock();
  5.       set_fatal_error(errmsg);
  6.       return 1;
  7.     }

结合一部分注释, 以及代码上下文的内容, 可以知道M2在初始化dump线程的时候, 会检查S1的一些GTID相关的状态,
这段代码会检查从库是否能"继续"从主库同步事务;
判断的条件可以简单描述为:主库不能purge掉从库还没有execute的事务(或者是主库压根就没有那一部分日志);

一直到这里, 都证明了最初的判断是没问题的, 那为什么M2的binlog全部都在, 但是S1又报这个错误了?
登录M2, 看一下GTID_Purged的信息,


居然还真的有purged的信息, 不过这个UUID并不是M2的, 而是M1的;
在replication中, 会有这么一种现象:通过replication获得的事务,在SQL thread复现完以后, 会自动purge掉;
所以在M2上面, 就出现了M1的GTID被purge的信息;
由于M1和M2并 没有开启slave-log-update , 所以S1在以M2为主库的时候,无法获取到M1的事务 ,
而切换的过程中, S1断开了与M1的连接, 在建立起与M2的连接前, M2复现了一些M1的事务, 并Purge掉了;
当S1的master切换到M2以后, 在dump前, 会检查到M2上 9cfe6b63-3e90-11e6-a1db-525400e9a4af:1 -66177的事务都全部purge掉了,

所以S1连接到M2之后,发现S1的executed_gtid中,  9cfe6b63-3e90-11e6-a1db-525400e9a4af的事务低于66177(凭记忆, 报错的时候是33000多,估计是因为网络的波动的原因, 同步中断了有一阵子了) , 所以报出了之前的错误:master has purged binary logs;

之后在测试环境搭建了一套测试环境, 在Master的GTID_Purged超过Slave的Executd_GTID时, 必定会报出这个错误, 不论这个GTID的UUID是不是Master自己的;

总结:
所以在这个案例中, 最合适的做法是在S1上面Purge掉主库已经Purged的事务, 然后再使用auto_position=1的方式进行同步;
以后再遇到类似的问题, 也可以遵循一个基本的原则来判断是需要purge, 还是跳过:
从库在开始同步前,主库 会依靠GTID来确认从库在开始同步以后, 能够把每一个主库上执行过的事务(包括slave的SQL Thread)都复现一次,最终保持和主库完全一致;
判断方法也很简单,基本基于两个条件:
1.主库不能purge从库还没有execute的事务(即从库的executed_GTID要大于主库的GTID_Purged );
2.主库上的事务号不能低于从库 (即从库的executed_GTID的最后一个事务 要在主库的 executed_GTID的范围之内 );
PS: 在这个案例中, 由于从库已经获取不到从33000多到66177的事务了(主库GTID_Purged中的记录), 所以不符合条件1终止同步过程, 并报错;
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
2205 0
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
12月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
1055 6
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
2235 2
|
监控 关系型数据库 MySQL
Flink CDC MySQL同步MySQL错误记录
在使用Flink CDC同步MySQL数据时,常见的错误包括连接错误、权限错误、表结构变化、数据类型不匹配、主键冲突和
771 17
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
2020 11
|
SQL 存储 关系型数据库
Mysql主从同步 清理二进制日志的技巧
Mysql主从同步 清理二进制日志的技巧
353 1
|
关系型数据库 MySQL Linux
mysql 主从同步 实现增量备份
【8月更文挑战第28天】mysql 主从同步 实现增量备份
416 3
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版产品使用问题之使用CTAS同步MySQL到Hologres时出现的时区差异,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
SQL 存储 关系型数据库
实时计算 Flink版产品使用问题之同步MySQL多张表的过程中,内存释放依赖于什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

推荐镜像

更多