一句话总结
这 4 个东西,就是 MySQL 主从复制的“进度条 + 账本”。
- 主库有两个:
gtid_executed、gtid_purged - 从库有两个:
Retrieved_Gtid_Set、Executed_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 = 每一块砖的编号
流程:
- 搬运工去主库把砖拉回来 →Retrieved_Gtid_Set(拉回来了)
- 砌墙工把拉回来的砖砌上墙 →Executed_Gtid_Set(砌完了)
- 主库执行过的所有砖 →
gtid_executed - 主库扔掉不要的旧砖 →
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线程)
关联文档
- MySQL GTID 主从故障排查 — GTID 故障排查
- MySQL 复制原理与配置 — GTID 复制原理