MySQL中gtid_purged 的初始化和更新机制详解

 更新时间:2025年12月11日 11:29:56   作者:翔云123456  
文章介绍了MySQL中的gtid_purged变量,该变量用于记录已经从磁盘上被清除的二进制日志文件中的事务的GTID集合,它在服务器启动时初始化,本文介绍的非常详细感兴趣的朋友一起看看吧

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_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的从库则在每个事务提交时实时更新。

到此这篇关于MySQL中gtid_purged 的初始化和更新机制的文章就介绍到这了,更多相关mysql gtid_purged内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql数据库添加用户及分配权限具体实现

    mysql数据库添加用户及分配权限具体实现

    这篇文章主要介绍了mysql数据库添加用户及分配权限的方法,需要的朋友可以参考下
    2014-02-02
  • Mysql查询语句优化技巧

    Mysql查询语句优化技巧

    这篇文章主要介绍了Mysql查询语句优化技巧的相关资料,需要的朋友可以参考下
    2016-04-04
  • mysql通过@变量实现递归详细实例

    mysql通过@变量实现递归详细实例

    众所周知目前的mysql版本中并不支持直接的递归查询,下面这篇文章主要给大家介绍了关于mysql通过@变量实现递归的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • MySQL8新特性:持久化全局变量的修改方法

    MySQL8新特性:持久化全局变量的修改方法

    这篇文章主要给大家介绍了关于MySQL 8新特性:持久化全局变量的修改的相关内容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • MySQL高级查询之JOIN、子查询、窗口函数实际案例

    MySQL高级查询之JOIN、子查询、窗口函数实际案例

    这篇文章主要介绍了MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函数则提供灵活的数据统计和排名功能,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • MYSQL的慢SQL优化的实现

    MYSQL的慢SQL优化的实现

    本文主要介绍了MYSQL的慢SQL优化的实现,从慢SQL定义、影响、常见场景与危害、识别与监控、分析、优化方法、执行计划分析、案例分析、总结与最佳实践、常见优化误区、日常开发预防措施等方面详细阐述,感兴趣的可以了解一下
    2026-05-05
  • Mysql基础教程之增删改查语句

    Mysql基础教程之增删改查语句

    这篇文章主要给大家介绍了关于Mysql基础教程之增删改查语句的相关资料,以下是MySQL最基本的增删改查语句,很多IT工作者都必须要会的命令,也是IT行业面试最常考的知识点,需要的朋友可以参考下
    2023-10-10
  • MySQL视图的概念和操作函数详解

    MySQL视图的概念和操作函数详解

    对MySQL数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理,下面这篇文章主要给大家介绍了关于MySQL数据库基本SQL语句教程之高级操作中视图的相关资料,需要的朋友可以参考下
    2023-03-03
  • 详解MySQL自增主键的实现

    详解MySQL自增主键的实现

    现在大部分的软件开发都离不开数据库。而mysql也是经常会用到的一个数据库。mysql数据库中有一个主键生成规则,就是自增。也是我们经常会用到的。本文就来介绍一下
    2021-09-09
  • mysql大数据查询优化经验分享(推荐)

    mysql大数据查询优化经验分享(推荐)

    这篇文章主要介绍了mysql大数据查询优化经验分享,真的是正儿八经的mysql优化技巧,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-03-03

最新评论