GTID 自动定位是什么
打开 SOURCE_AUTO_POSITION 之后,从库不必再关心二进制日志文件名与偏移量:它主动上报自己已执行的 GTID 集合(gtid_executed),源端推送两者的差集,从库就知道该从哪里接着执行。这让换源、故障切换与重建从库都省掉了手工计算位点这一步,也避免了位点抄错导致的数据静默缺失。代价是整个拓扑都必须启用 GTID,并且从库绝不允许本地写入,否则差集判断就失去意义。
基本信息
| 开关 | CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION = 1 |
|---|---|
| 前提 | 两端都开启 gtid_mode=ON 与 enforce_gtid_consistency=ON |
| 原理 | 从库上报 gtid_executed,源端推送差集 |
| 验证 | SHOW REPLICA STATUS 中的 Auto_Position 应为 1 |
| 收益 | 切换与换源不需要手工指定位点 |
典型使用场景
- 新建从库时直接使用自动定位
- 主库切换后让从库自动接续,不必重算位点
- 重建损坏或落后的从库
- 多源复制场景下的定位与对齐
- 避免人工抄写位点产生的低级错误
启用与验证
启用与验证
STOP REPLICA;
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='10.0.0.10', SOURCE_USER='repl', SOURCE_PASSWORD='***',
SOURCE_AUTO_POSITION = 1;
START REPLICA;
SHOW REPLICA STATUS\G
-- 关注 Auto_Position: 1
-- 对比 Retrieved_Gtid_Set 与 Executed_Gtid_Set
SELECT @@GLOBAL.gtid_executed;
SELECT @@GLOBAL.gtid_purged;状态字段读法
| 字段 | 含义 | 判读方式 |
|---|---|---|
| Auto_Position | 是否按 GTID 定位 | 为 0 说明仍在用文件名与位点 |
| Retrieved_Gtid_Set | 已从源端拉取的事务集合 | 持续增长说明拉取链路正常 |
| Executed_Gtid_Set | 已执行的事务集合 | 包含本地事务,需留意差异 |
| gtid_purged | 已在来源之外清理的事务 | 抄错一位会让差集判断全错 |
| Seconds_Behind_Source | 应用延迟估算值 | 结合 GTID 差集一起判断 |
从库如果执行过本地事务(也就是没有禁写),差集判断会把这些事务一起算进去,形成永久缺口。这类从库只能重建,调参数修不回来。预防手段很简单:从库一律开启 super_read_only,运维也不要为了省事临时把它关掉。
用 --skip-gtids 手工注入的事务会破坏自动定位的前提:临时排查可以接受,事后必须重建从库或补开对应的 GTID,否则切换时数据对不上。
位点与 GTID 混用是常见隐患:一部分从库按位点、一部分按 GTID,切换时坐标系对不上,统一到 GTID 可以省掉大量对齐工作。