GTID 配置是什么
GTID 为每个事务分配全局唯一编号,从库按编号自动判断该事务是否已执行,不用再手工维护位点,重建从库和切换拓扑都更简单。开启不能一步到位:要按 OFF、OFF_PERMISSIVE、ON_PERMISSIVE、ON 四级逐级切换,每一步都确认复制与业务正常;同时把 enforce_gtid_consistency 打开并写入配置文件固化。
基本信息
| 切换顺序 | 先 enforce_gtid_consistency,再 gtid_mode |
|---|---|
| 四级状态 | OFF → OFF_PERMISSIVE → ON_PERMISSIVE → ON |
| 匿名事务 | 切换前必须消化完,GTID 无法承载匿名事务 |
| 固化配置 | 写入 my.cnf,防止重启后回退 |
| 关键变量 | gtid_executed / gtid_purged / gtid_mode |
典型使用场景
- 新搭主从:建议一开始就用 GTID,省去位点维护
- 存量实例开启:按四级渐进切换并逐级观察
- 从库重建:用备份加 gtid_purged 设置起始位置
- 故障切换:新主选 gtid_executed 最完整的节点
- 拓扑核对:比较各节点 gtid_executed 是否是超集关系
- 中间件兼容性确认:MHA 或代理层都要支持 GTID 才能全量开启
渐进切换与核对
渐进切换与核对
SET @@GLOBAL.enforce_gtid_consistency = WARN; -- 先告警观察是否有不兼容语句
SET @@GLOBAL.enforce_gtid_consistency = ON;
SET @@GLOBAL.gtid_mode = OFF_PERMISSIVE; -- 允许匿名与 GTID 事务共存
SET @@GLOBAL.gtid_mode = ON_PERMISSIVE;
SELECT @@GLOBAL.gtid_mode;
-- 等待所有从库不再产生匿名事务后:
SET @@GLOBAL.gtid_mode = ON;
SELECT @@GLOBAL.gtid_executed; -- 各节点核对进度与超集关系
SELECT @@GLOBAL.gtid_purged; -- 用备份重建从库时设置它
-- 完成后写进 my.cnf 固化:gtid_mode = ON / enforce_gtid_consistency = ON四级状态含义
| 状态 | 匿名事务 | GTID 事务 |
|---|---|---|
| OFF | 允许 | 不允许 |
| OFF_PERMISSIVE | 允许 | 允许 |
| ON_PERMISSIVE | 允许但告警 | 允许 |
| ON | 不允许 | 允许 |
拓扑内所有节点(含 MHA 与中间件)都要支持 GTID 再全量开启。
ON_PERMISSIVE 阶段是过渡态:此时仍允许匿名事务写入,若停留在这一级就切换主库或重建从库,容易出现位点对不齐的问题,应尽快推进到 ON 并固化配置。
各节点的 gtid_executed 之间应为相等或超集关系;发现某个节点缺少事务时不要手工修改 gtid_purged 掩盖问题,正确做法是用备份重建从库并核对 gtid_purged 的取值。
切换前把每一级命令与验证步骤写成脚本并按序执行:手工敲错一步就可能停在中间状态,回退与排查成本远高于提前准备一份可复用的切换脚本。