在MySQL中,gtid_purged 的初始化和更新机制

目录

MySQL的 gtid_purged变量记录了那些 已提交但在服务器二进制日志中已被清除的事务的GTID集合 。它的初始化和更新机制会根据服务器的角色(主库或从库)、配置及操作的不同而变化。其核心关系为: gtid_purged = gtid_executed - 当前所有二进制日志中记录的GTID集合。

初始化

前文中已讲到 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_executedgtid_purged
从库 (binlog开启且log_slave_updates=ON) 清理二进制日志时。 行为与主库一致,非实时更新。
通用命令 执行 RESET MASTERSET @@GLOBAL.gtid_purged 语句时。 会直接清空或设置该变量的值,通常用于搭建/恢复复制环境。

补充说明

除了上述核心机制,以下几点对理解和管理gtid_purged也至关重要:

  1. 初始化依赖的配置 :系统变量binlog_gtid_simple_recovery(默认ON)决定了启动时初始化gtid_purged的效率。
    • ON(默认) :仅读取最旧最新的两个二进制日志文件来计算,速度快。
    • OFF :可能需要扫描所有二进制日志文件来计算,速度慢,仅在升级等特定场景下可能需要设置。
  2. 与备份恢复的关系 :使用mysqldump进行逻辑备份时,导出的SQL文件默认会包含一条SET @@GLOBAL.gtid_purged = ...语句。这条语句的作用是告诉新的从库"备份文件中已经包含了哪些GTID对应的事务,这些事务无需再从主库复制"。在多源复制或已有数据的实例上恢复时,需要谨慎处理此语句。
  3. 约束条件 :在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的从库则在每个事务提交时实时更新

相关推荐
2601_949593652 小时前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__2 小时前
mysql新老项目版本选择
数据库·mysql
Dxy12393102163 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light3 小时前
MySQL相关问题
数据库·mysql
蜡笔小炘3 小时前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长3 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚4 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设4 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据5 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300965 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python