首页/数据/数据库速查/GTID 自动定位(SOURCE_AUTO_POSITION)
主从复制与高可用53 条

GTID 自动定位(SOURCE_AUTO_POSITION)

AUTO_POSITION=1 让从库用 GTID 差集自动找起点:不再依赖手工位点,换源/切换/重建从库都不需要担心字节偏移。

数据库速查数据更新于 2026-10-13

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 可以省掉大量对齐工作。

易错点

  • 从库没有禁写产生本地事务:差集出现永久缺口,只能重建
  • 用 --skip-gtids 手工注入事务:直接破坏自动定位的前提
  • 只在一端开启 gtid_mode:复制关系根本建立不起来
  • 切换后不核对 GTID 差集:表面上在跑,实际少了几个事务

数据来源与参考

  • MySQL 8.0 Reference Manual: GTID Auto-Positioning

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌