首页/数据/数据库速查/故障切换(Failover)手动流程
主从复制与高可用53 条

故障切换(Failover)手动流程

主库宕机时的手动切换:确认故障不可恢复 → 评估可接受的数据丢失窗口 → 提升数据最新的从库 → 隔离旧主(fencing)→ 重建拓扑。

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

手动 Failover 是什么

主库宕机且无法快速恢复时的手动切换流程:先确认故障不可恢复,再评估可接受的数据丢失窗口,然后提升数据最新的从库、隔离旧主防止带病复活、最后重建拓扑并切走应用流量。每一步都要留下记录,事后才能说清到底丢了多少事务。

基本信息

判定手段多路探测(网络、端口、进程、只读探测)避免误判
选主依据GTID 环境看 gtid_executed 最完整;非 GTID 比位点
隔离手段断电、禁用网卡、回收账号权限,防止旧主写回
流量切换应用改配置,或切换 VIP / DNS / 代理后端
关键动作取消只读、清理复制元数据、重置从库指向

典型处置顺序

  • 确认主库确实宕机:多路探测并排除网络抖动与中间件问题
  • 选择 GTID 最完整的从库,并确认它已回放完中继日志
  • 提升该从库:停复制、清复制元数据、取消只读
  • fencing 旧主:断电或禁用网卡并回收权限,防止其恢复后继续写入
  • 其他从库改挂新主,逐台启动并核对复制状态
  • 应用切流并记录丢失事务窗口,随后补齐或对账

提升与改挂

提升与改挂
-- 提升(目标从库执行)
STOP REPLICA;
RESET REPLICA ALL;
SET GLOBAL super_read_only = OFF;
SET GLOBAL read_only = OFF;
SELECT @@GLOBAL.gtid_executed;   -- 记录切换时刻的 GTID 集合

-- 其他从库改挂新主
STOP REPLICA;
CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.0.0.11', SOURCE_USER='repl',
  SOURCE_PASSWORD='强口令', SOURCE_AUTO_POSITION=1;
START REPLICA;
SHOW REPLICA STATUS\G   -- 确认 IO 与 SQL 线程均为 Yes 且无错误

步骤与验证点

步骤要验证什么常见失误
确认故障多路探测结论一致网络抖动被误判为宕机
选择新主gtid_executed 为超集选了数据落后的从库导致丢更多
提升新主只读已关闭、复制已停止未清复制元数据,重启后复制错乱
隔离旧主无法再写入任何数据旧主恢复后造成双写脑裂
重建拓扑各从库复制线程正常从库指向旧主,数据回退
GTID 环境下各从库可能进度不同:切换前比较 gtid_executed,选择超集节点,避免丢更多事务。
没有隔离旧主就切流是最危险的做法:旧主恢复后会继续接受写入,与新主形成双主,数据冲突几乎不可自动修复。

易错点

  • 误判主库宕机(实际只是网络抖动)就切换,造成不必要的双主与写丢失
  • 选中的从库未回放完中继日志,提升后仍缺最新事务
  • 忘记 fencing 旧主,旧主复活后与新主双写,数据被拆成两半
  • 切换后未改应用连接配置或 VIP,应用仍连旧主地址,写入全部失败
  • 没有记录丢失事务窗口,事后对账无从下手

数据来源与参考

  • MySQL 8.0 Reference Manual: Failover
  • MySQL 8.0 Reference Manual: GTID Sets

相关工具

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