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