MySQL 机器重启后,gtid_executed 是如何初始化的

MySQL 实例启动后,

gtid_executed 的初始化是一个结合了持久化存储和二进制日志扫描的过程,其核心目标是准确重建服务器已知的所有已提交事务的 GTID 集合。

gtid_executed 的初始化

  1. 从 mysql.gtid_executed 表加载(主要来源)
  • 持久化存储:在实例正常运行期间,MySQL 会定期(例如在 binlog 文件轮换时或服务器关闭时)将内存中的 gtid_executed 集合进行"压缩"并持久化到 mysql.gtid_executed 系统表中。
  • 初始化基础值:实例启动时,首先会从 mysql.gtid_executed 表中读取所有记录,将这些记录的 GTID 集合合并,作为初始化 @@GLOBAL.gtid_executed 系统变量的基础值。这是最快、最主要的数据来源。
  1. 扫描 Binlog 文件以进行验证和补充
  • 扫描现存文件:继上一步之后,服务器会扫描磁盘上所有现存的(未被 PURGE 的)binlog 文件。
  • 重建 Binlog 中的 GTID 集合:对于每个 binlog 文件,服务器通过解析其头部的 Previous_gtids_log_event 和文件体内的 Gtid_log_event,计算出该文件所包含的完整 GTID 区间。
  • 计算并合并:服务器将所有现存 binlog 文件中的 GTID 集合合并,得到一个代表"磁盘上记录的已执行事务"的 GTID 集合,我们称之为 binlog_gtid_set。
  1. 计算最终的 gtid_executed
    最终的
    @@GLOBAL.gtid_executed 值是以下两个集合的并集(UNION): gtid_executed = 从mysql.gtid_executed表加载的集合 ∪ binlog_gtid_set

这样设计的目的:

  • 效率:从表加载速度远快于解析所有 binlog 文件。
  • 安全性/正确性:mysql.gtid_executed 表可能由于某些原因(如未及时刷新)未能包含最新提交的事务。扫描 binlog 确保了任何已经记录到二进制日志中的事务都不会被遗漏,从而保证了 gtid_executed 集合的绝对正确性。

衍生出 gtid_purged

gtid_executed 确定之后,@@GLOBAL.gtid_purged 的值便通过一个简单的集合差运算得出: gtid_purged = gtid_executed - binlog_gtid_set 这个结果代表的是已经从磁盘上被清除的 binlog 文件中所记录的那些事务。

上面过程的流程如下图:
MySQL实例启动 从mysql.gtid_executed表加载GTID集合 扫描所有现存binlog文件, 计算binlog_gtid_set 计算最终gtid_executed: 表中的gtid集合 U binlog中的gtid集合 计算gtid_purged = gtid_executed - binlog_gtid_set

相关推荐
张洛闻Eren6 分钟前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安22 分钟前
MySQL-触发器
数据库·mysql
白远山24 分钟前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro33 分钟前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理
2603_965148111 小时前
AI+API选品:下一代智能商务助手雏形已现
java·大数据·数据库·人工智能·数据挖掘
大猫和小黄1 小时前
MySQL锁与MVCC深度解析
mysql·mvcc·
lbb 小魔仙1 小时前
OpenClaw + cpolar 实战:远程 NAS、分享小游戏、RDP,再配置公网 AI 入口
数据库·人工智能·redis·oracle·prometheus
李白客2 小时前
数据融合平台怎么选:批流一体、实时同步与数据质量的 7 个维度
数据库·数据库架构
数据库小学妹2 小时前
MySQL库存扣减实战:原子UPDATE、分桶方案与锁范围分析
数据库·后端·mysql
旺仔不是程序员2 小时前
LIMIT 1:PostgreSQL 只取一行的高效查询姿势
数据库·后端·sql