MySQL 机器重启后gtid_executed初始化流程解析

 更新时间:2025年12月11日 11:27:50   作者:翔云123456  
文章介绍了MySQL中gtid_executed和gtid_purged的初始化过程,包括从mysql.gtid_executed表加载、扫描binlog文件以验证和补充、最终计算并合并这两个集合,以及gtid_purged的计算方法,感兴趣的朋友跟随小编一起看看吧

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。

补充说明:如果版本只涉及 5.7.8 及以后版本,binlog_gtid_set 计算时只使用最新binlog文件即可。

  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 确定之后,再看下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(步骤二的结果)。

补充说明:可能有同学会有疑问,为什么不直接使用 最旧binlog文件 中的 Previous_gtids_log_event 作为 gtid_purged?实际上,这里要考虑没有记录binlog的情况,如果没有打开binlog 或者某个事务没有记录binlog,直接使用最旧binlog文件 中的 Previous_gtids_log_event,是有问题的。

上面过程的流程如下图:

到此这篇关于MySQL 机器重启后gtid_executed初始化流程解析的文章就介绍到这了,更多相关mysql gtid_executed初始化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解MySQL和Redis的二级缓存

    深入理解MySQL和Redis的二级缓存

    在数据库系统中,二级缓存是一种用于缓存频繁访问的数据的机制,本文就来介绍一下MySQL和Redis二级缓存的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2025-08-08
  • Mysql服务器的安装配置与启动关闭方法详解

    Mysql服务器的安装配置与启动关闭方法详解

    MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一
    2021-10-10
  • MySQL中FIND_IN_SET()函数与in的区别及说明

    MySQL中FIND_IN_SET()函数与in的区别及说明

    文章介绍了SQL中FIND_IN_SET函数和IN关键字的区别及使用,FIND_IN_SET允许字段或常量作为参数并进行精确匹配,而IN只允许常量且进行完全匹配,文章指出使用FIND_IN_SET可能导致索引失效,从而增加查询时间
    2025-10-10
  • SQL LIKE运算符用法示例及通配符解释

    SQL LIKE运算符用法示例及通配符解释

    这篇文章主要为大家介绍了SQL LIKE运算符用法示例及通配符解释,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • mysql如何按字段查询重复的数据

    mysql如何按字段查询重复的数据

    这篇文章主要介绍了mysql如何按字段查询重复的数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • PHP访问MySQL查询超时处理的方法

    PHP访问MySQL查询超时处理的方法

    PHP连接MySQL主要是使用Mysql提供的 libmysqlclient 的客户端库,同时也延伸出来 mysql 和 mysqli 两套PHP的扩展,相对来说 mysqli 比 mysql 更好,更稳定。
    2011-05-05
  • InnoDB中不同SQL语句设置锁的情况详解

    InnoDB中不同SQL语句设置锁的情况详解

    这篇文章主要介绍了InnoDB中不同SQL语句设置锁的情况详解,在Mysql中,锁定读、更新、删除操作通常会对SQL语句处理过程中扫描到的每条索引记录设置记录锁,需要的朋友可以参考下
    2024-01-01
  • 一文带你了解MySQL之InnoDB统计数据是如何收集的

    一文带你了解MySQL之InnoDB统计数据是如何收集的

    通过show index可以看到关于索引的统计数据,那么这些统计数据是怎么来的呢,它们是以什么方式收集的呢,本章将聚焦于InnoDB存储引擎的统计数据收集策略,需要的朋友可以参考下
    2023-05-05
  • Mysql数据库设计三范式实例解析

    Mysql数据库设计三范式实例解析

    这篇文章主要介绍了Mysql数据库设计三范式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • MySQL自增ID用完了的四种解决方式

    MySQL自增ID用完了的四种解决方式

    这篇文章主要介绍了MySQL自增ID用完了的四种解决方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06

最新评论