gtid_purged已提交但在服务器二进制日志中已被清除的事务的gtid集合gtid_purgedgtid_executed
初始化
前文中已讲到 gtid_executed 和gtid_purged 初始化,这里再回顾下gtid_purged 初始化。
在 gtid_executed 确定之后,再看下gtid_purged 的计算。
实际上,简单说,
gtid_executed = gtid purged + gtid not purged
gtid_purged代表的是已经从磁盘上被清除的 binlog 文件中所记录的那些事务。
步骤一:计算 gtids_in_binlog(所有曾被记录在日志中的 gtid) 计算方法:最新的二进制日志文件中的 previous_gtids_log_event(上一个日志的 gtid 集合)加上该最新日志文件自身的 gtid 事务。
步骤二:计算 gtids_in_binlog_not_purged(未被清理的 gtid) 计算方法: 用 gtids_in_binlog(步骤一的结果)减去最老的二进制日志文件中的 previous_gtids_log_event 集合。
步骤三:计算 gtid_purged(已清理的 gtid) 计算方法: 用 gtid_executed(所有执行过的 gtid)减去 gtids_in_binlog_not_purged(步骤二的结果)。
更新时机
gtid_purged的行为主要由服务器角色和二进制日志(binlog)配置决定,下表总结了主要场景下的更新时机:
| 场景分类 | 更新时机 | 关键特征 |
|---|---|---|
| 系统启动初始化 | 服务器启动时。 | 依据binlog_gtid_simple_recovery设置,通过扫描二进制日志计算得出。 |
| 主库 (binlog开启) | 清理二进制日志时(如执行purge binary logs或日志过期自动删除)。 | 非实时更新。只有当包含某些gtid的最后一个二进制日志文件被删除后,这些gtid才会被加入gtid_purged。 |
| 从库 (binlog关闭或log_slave_updates=off) | 应用复制事务的提交阶段。 | 实时更新。因为无法通过binlog持久化gtid,所以每提交一个复制事务,其gtid会同时计入gtid_executed和gtid_purged。 |
| 从库 (binlog开启且log_slave_updates=on) | 清理二进制日志时。 | 行为与主库一致,非实时更新。 |
| 通用命令 | 执行 reset master 或 set @@global.gtid_purged 语句时。 | 会直接清空或设置该变量的值,通常用于搭建/恢复复制环境。 |
补充说明
除了上述核心机制,以下几点对理解和管理gtid_purged也至关重要:
- 初始化依赖的配置:系统变量
binlog_gtid_simple_recovery(默认on)决定了启动时初始化gtid_purged的效率。on(默认):仅读取最旧和最新的两个二进制日志文件来计算,速度快。off:可能需要扫描所有二进制日志文件来计算,速度慢,仅在升级等特定场景下可能需要设置。
- 与备份恢复的关系:使用
mysqldump进行逻辑备份时,导出的sql文件默认会包含一条set @@global.gtid_purged = ...语句。这条语句的作用是告诉新的从库“备份文件中已经包含了哪些gtid对应的事务,这些事务无需再从主库复制”。在多源复制或已有数据的实例上恢复时,需要谨慎处理此语句。 - 约束条件:在mysql 5.7版本中,只有在
gtid_executed集合为空时(例如执行reset master之后),才能设置gtid_purged。更高版本的限制可能有所放松,但此操作仍需在明确知晓影响的情况下执行。
应用与排查要点
- 搭建从库:这是
gtid_purged最主要的使用场景。在从库上使用set @@global.gtid_purged来声明已从备份数据中恢复的事务gtid集,是建立基于gtid复制的关键步骤之一。 - 常见问题排查:如果出现“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”错误,通常是因为从库
gtid_purged集合中的部分gtid在主库的二进制日志中已被清除。解决方案通常是从头重建复制,或使用第三方工具(如binlog server)来提供丢失的日志。
总结
简单来说,gtid_purged是一个用于追踪“已提交但日志已丢失事务”的gtid集合。它在服务器启动时初始化,更新时机取决于配置:主库和开启log_slave_updates的从库在清除二进制日志时更新;未开启log_slave_updates的从库则在每个事务提交时实时更新。
到此这篇关于mysql中gtid_purged 的初始化和更新机制的文章就介绍到这了,更多相关mysql gtid_purged内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论