首页/数据/数据库速查/gtid_executed 与 gtid_purged 语义
主从复制与高可用53 条

gtid_executed 与 gtid_purged 语义

gtid_executed:本实例已执行的全部 GTID 集;gtid_purged:已被 binlog 清理但仍需声明的 GTID 集(新从库的起点)。两者配合决定「谁还缺什么事务」。

数据库速查数据更新于 2026-10-13

两个 GTID 集合是什么

已执行集合记录本实例执行过的全部事务编号;已清理集合记录「日志里已经不存在、但必须声明为主库已有」的事务编号。前者决定还差哪些事务没执行,后者决定新从库从哪里开始拉取。两者配合使用,是把 GTID 复制接对的关键。

基本信息

已执行集合gtid_executed,本实例执行过的事务全集
已清理集合gtid_purged,日志已清理但需声明的部分
典型用途从备份重建从库时声明起点,避免重复重放
校验函数gtid_subset 判断一个集合是否为另一个的子集
可写前提已清理集合只能在没有业务数据的实例上设置

典型使用场景

  • 备份重建从库:从备份文件读出位点信息,声明清理集合作为起点
  • 差集判断:比较主从的执行集合,确认从库是否还缺事务
  • 重建前校验:用子集判断函数确认声明值不超过备份对应范围
  • 切主评估:切换后核对新主的执行集合是否覆盖所有副本
  • 故障复盘:通过集合比对判断是否发生过静默跳事务

查看与设置

查看与设置
SELECT @@GLOBAL.gtid_executed;        -- 已执行的全部事务
SELECT @@GLOBAL.gtid_purged;          -- 已清理部分(从库建点)
-- 校验声明值确实包含在备份对应集合内
SELECT GTID_SUBSET('3a7f1e3b-1111-1111-1111-111111111111:1-5000000',
                   @@GLOBAL.gtid_executed);
-- 仅限空实例:声明已清理集合作为复制起点
SET GLOBAL gtid_purged = '3a7f1e3b-1111-1111-1111-111111111111:1-5000000';
SELECT @@GLOBAL.gtid_purged;

两个集合对比

对比项gtid_executedgtid_purged
含义本实例已执行的事务全集日志已清理但仍需声明的事务
是否可清空重置复制元数据时可清空只应在空实例上设置
典型读法判断还差哪些事务判断从库复制起点
设置风险低,属于实例状态高,设错会导致静默缺数据
判断从库是否追平:比较两边的已执行集合差异,差异为空说明已追平,比看单条状态文本更可靠。
给已有业务数据的实例补声明清理集合,会让实例「假装」已执行这些事务,产生静默数据缺失且难以发现。

易错点

  • 给非空实例补声明:数据与事务声明不一致,复制会静默跳过事务
  • 只看已执行集合不看已清理集合:新从库起点判断错误,从头重放引发新旧数据冲突
  • 声明值随意扩大范围:从库认为自己已拥有全部事务,实际数据缺失
  • 不做事后校验:声明完成就启动复制,缺少追平确认步骤

数据来源与参考

  • MySQL 8.0 Reference Manual: GTID Sets

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌