MySQL

GTID 集合详解

·4 分钟阅读·1553 字
📋 目录

一句话总结

4 个东西,就是 MySQL 主从复制的“进度条 + 账本”

  • 主库有两个:gtid_executedgtid_purged
  • 从库有两个:Retrieved_Gtid_SetExecuted_Gtid_Set

GTID主从流转流程图

【主库 Master】
所有事务执行 → 记入binlog → @@gtid_executed(全量已执行事务集合)

定时purge过期binlog → @@gtid_purged(日志已删除、磁盘不存在的GTID)

       ↓ 网络(IO线程拉取)
【从库 Slave_IO线程】
拉取主库缺失GTID日志 → 落地relay-log → Retrieved_Gtid_Set【已拉取,未回放】

       ↓ 交给SQL线程
【从库 Slave_SQL线程】
顺序回放relaylog事务 → 落地本地数据 → Executed_Gtid_Set【已执行完毕】

一、主库上的 2 个 GTID 集合

1. gtid_executed(已执行)

意思:
本机已经执行成功、并且写入 binlog 的所有事务编号。

大白话:

主库:“这些事务我都执行完了,都记在日志里了。”

作用:
主库告诉从库:我有哪些事务。


2. gtid_purged(已清理)

意思:
binlog 被自动删除(purge)了,磁盘上已经不存在的事务。

大白话:

主库:“这些日志我删掉了,你别再来找我要了。”

作用:
告诉从库:有些日志我删了,你同步只能从剩下的开始。


二、从库上的 2 个 GTID 集合(最关键)

3. Retrieved_Gtid_Set(已拉取)

**意思:从库 IO 线程 已经从主库拉回来、放到中继日志(relay log)**里的 GTID。

大白话:

从库 IO 线程:“这些日志我已经下载完了!”

阶段:下载完成,但还没执行。


4. Executed_Gtid_Set(已执行)

意思:从库 SQL 线程 已经重放执行完成的 GTID。

大白话:

从库 SQL 线程:“这些事务我已经执行完了!”

阶段:执行完成,主从数据一致。


三、最经典、最形象的比喻(必看)

把主从复制比作 搬砖

  • 主库 = 仓库
  • 从库 IO 线程 = 搬运工
  • 从库 SQL 线程 = 砌墙工
  • GTID = 每一块砖的编号

流程:

  1. 搬运工去主库把砖拉回来Retrieved_Gtid_Set(拉回来了)
  2. 砌墙工把拉回来的砖砌上墙Executed_Gtid_Set(砌完了)
  3. 主库执行过的所有砖 →
    gtid_executed
  4. 主库扔掉不要的旧砖 →
    gtid_purged

四、主从同步是否正常,就看这两条

1. Retrieved_Gtid_Set 不断变大

说明 IO 线程正常拉日志。

2. Executed_Gtid_Set 不断追上 Retrieved_Gtid_Set

说明 SQL 线程正常执行,主从一致


五、最终超级精简记忆版(背这个)

  • gtid_executed:主库执行过的所有事务
  • gtid_purged:主库删掉的事务
  • Retrieved_Gtid_Set:从库拉回来的事务(IO线程)
  • Executed_Gtid_Set:从库执行完的事务(SQL线程)

关联文档