首页/数据/数据库速查/计划内主从切换(Switchover)标准流程
主从复制与高可用53 条

计划内主从切换(Switchover)标准流程

计划切换要「先停写、追平、再切」:旧主设为只读停业务写入,等从库完全追平(GTID 集对齐),再把从库提升为主并切换应用连接。

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

计划内切换怎么做

计划内主从切换的标准节奏是先停写、再追平、最后切换:旧主设为只读并停止业务写入,等从库把事务集合完全补齐,再把从库提升为主并切换应用连接。整个过程最关键的约束是同一时刻只能有一个写入方,否则两个实例都能写会造成数据分叉,后果比一次普通宕机严重得多。

基本信息

用途计划内的主从角色互换
核心顺序先停写、再追平、最后切换
追平判据事务集合比较,而不是延迟归零
应用侧连接串或代理层需要同步切换
关键约束同一时刻只能有一个写入方
切换之后旧主作为新从库重新挂载

标准步骤

  • 旧主设置只读并停止业务写入,必要时挂维护页
  • 旧主记录最终事务集合,作为追平目标
  • 从库等待追平:确认已执行集合已包含目标集合
  • 从库取消只读并停止复制,应用连接切到新主
  • 旧主作为新从库重新挂载到新主之下

关键操作

关键操作
# 旧主:第一步
SET GLOBAL read_only = ON;   # 停止写入
SELECT @@GLOBAL.gtid_executed;   # 记录最终事务集合作为追平目标
# 从库:第三步,等待追平
SELECT WAIT_FOR_EXECUTED_GTID_SET('最终集合', 60);   # 返回 1 表示已追平
# 从库:第四步,提升为新主
STOP REPLICA;
RESET REPLICA ALL;
SET GLOBAL super_read_only = OFF;
SET GLOBAL read_only = OFF;

切换环节与风险

环节动作风险
停写旧主设为只读并停业务写入漏停某个写入方会造成数据分叉
记录位点保存最终事务集合记录丢失就无法判断是否追平
等待追平按事务集合比较确认用延迟归零判断会出现假追平
提升取消只读并停止复制应用连接未切换时会出现双写
切连接连接串或代理层切换缓存未过期会导致仍连到旧主
回挂旧主挂到新主之下残留配置会导致复制关系异常
切换窗口内写入方必须唯一:应用连接串或代理层要同步切换,避免新旧主同时被写,数据一旦分叉修复代价极高。
追平判据用事务集合比较而不是延迟归零:拉取线程已经断开的场景下延迟同样显示为零,会造成假追平。

切换前检查清单

  • 确认所有写入方都能被停止或切走
  • 确认从库已通过事务集合比较追平
  • 确认应用侧连接切换方案与回滚方案
  • 确认旧主回挂为从库的配置已准备好
  • 把切换窗口与影响范围提前通知业务方
切换完成后不要立刻宣布结束:观察新主写入是否正常、从库是否正常挂载、应用错误率是否恢复,确认这几项都平稳才算收尾。

易错点

  • 用延迟等于零判断追平:拉取线程已断开的场景会假追平,切换后丢失数据
  • 应用连接没切完就放开新主写入:旧主恢复后继续产生写入,数据分叉难以修复
  • 切换前没有记录最终事务集合:无法判断从库是否真的追平,只能凭感觉操作
  • 旧主回挂时残留原复制配置:新从库启动异常或复制关系错乱,切换后还得二次返工

数据来源与参考

  • MySQL 8.0 Reference Manual: Switchover
  • Oracle 官方切换最佳实践

相关工具

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