首页/数据/数据工程与 ETL 速查/GTID:全局事务标识符
CDC 与同步53 条

GTID:全局事务标识符

GTID 形如 server_uuid:序号,为每个已提交事务生成全局唯一编号,让复制与断点续传不再依赖文件名和偏移。开启需 gtid_mode=ON 且 enforce_gtid_consistency=ON,切换要按 OFF → OFF_PERMISSIVE → ON_PERMISSIVE → ON 四步过渡。

GTID 是什么

GTID(全局事务标识符)给每个已提交的事务分配一个全局唯一编号,形式是「源实例 UUID : 事务序号」。它的意义在于把复制位置从「文件名加偏移」变成「已执行到哪一批事务」,主库切换后从库不用再去猜新旧主库的文件对应关系。对 CDC 链路同样有价值:用 GTID 表达起点,重新接入时更容易对齐,也能天然起到去重作用——同一个 GTID 在目标端只会执行一次。

基本信息

格式server_uuid:事务序号,如 3f2b...:101
开启条件gtid_mode=ON 且 enforce_gtid_consistency=ON
过渡步骤OFF → OFF_PERMISSIVE → ON_PERMISSIVE → ON
优势复制故障切换、位点表达与去重不依赖文件偏移
限制需实例与工具都支持;部分语句在 GTID 模式下受限
查看方式SHOW VARIABLES、SELECT @@GLOBAL.gtid_executed

查看 GTID 状态

查看 GTID 状态
SHOW VARIABLES LIKE 'gtid_mode';
SHOW VARIABLES LIKE 'enforce_gtid_consistency';
SELECT @@GLOBAL.gtid_executed;   -- 已执行 GTID 集合
SHOW MASTER STATUS\G             -- Executed_Gtid_Set 列
-- 8.4 起语句改名为:SHOW BINARY LOG STATUS\G

典型使用场景

  • 主从切换:切换后从库按 GTID 自动对齐,不用人工换算文件名与偏移
  • CDC 起点表达:把起点记成 GTID 集合,重建链路时更稳定
  • 链路核对:比对新旧实例的已执行集合,判断增量是否追平
  • 多级复制:级联拓扑下用 GTID 判断事务是否已经执行过
  • 审计与追溯:事务编号可以定位某次变更是何时被写入的
  • 数据校验:对比源端与目标端的已执行集合,快速判断增量是否已经追平

关键变量读法

变量含义注意
gtid_modeGTID 启用状态四步过渡期间有中间值
enforce_gtid_consistency是否强制 GTID 一致性约束必须先于 gtid_mode 开启
gtid_executed已执行的事务集合切换后可据此判断是否追平
gtid_purged已被清理的事务集合该范围内无法再回放
server_uuid实例唯一标识决定 GTID 前缀
GTID 过渡四步之间都要验证复制与业务,不要一步跳到 ON。
gtid_purged 记录的是已经无法回放的事务范围:如果采集端记录的起点落在里面,只能重新建立全量基线,不能指望继续增量。

易错点

  • 跳过过渡步骤直接开启 gtid_mode=ON,实例重启或复制中断
  • CDC 工具按文件位点记录、实例按 GTID 复制,两套口径混用后无法对齐
  • 只关注 gtid_mode 而忘了 enforce_gtid_consistency,部分语句仍会破坏一致性
  • 误判 gtid_purged 的范围,以为历史事务还能回放
  • 在 GTID 模式下使用不支持的语句,导致后续复制无法继续

数据来源与参考

  • MySQL 8.0 Reference Manual: Replication with Global Transaction Identifiers
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌