dgmgrl failover to 不是一键安全操作,因其依赖三个硬性前提:主库彻底失联、备库无归档缺口(v$archive_gap为空且sequence#比对无缺失)、mrp进程已停;否则将导致ora-16139错误或数据库不一致。

Failover 在 Oracle 12c Data Guard 中不是“一键就能安全跑通”的操作,DGMGRL 的 failover to 命令确实只敲一行,但前提是主库已彻底不可达、备库日志链完整、且你已接受必然的数据丢失。盲目执行会直接导致数据库不一致甚至无法打开。
为什么 DGMGRL failover to 不是真的一键?
表面看只需 failover to "stby_db",但背后隐含三个硬性前提,缺一不可:
- 主库已完全失联:你在主库上连
SELECT STATUS FROM V$INSTANCE都执行不了,V$ARCHIVE_DEST_STATUS查不到任何状态; - 备库无归档缺口:必须先在备库查
V$ARCHIVE_GAP返回空行,再比对V$ARCHIVED_LOG中最大SEQUENCE#和你掌握的主库最后归档号 —— 若差值 > 0,这部分 redo 永远丢失; - MRP 进程必须停掉:
SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY中MRP行状态得是NOT APPLYING或已消失,否则failover会卡在ORA-16139: media recovery required。
执行前必须手动验证的三件事
别跳过这步,DGMGRL 不会替你判断主库是否真挂了,它只信你输入的命令:
- 在备库运行:
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP—— 有结果就别继续,说明归档断档; - 在备库运行:
SELECT THREAD#, MAX(SEQUENCE#) FROM V$ARCHIVED_LOG GROUP BY THREAD#,然后和你手头主库最后归档文件名(如1_105_1234567890.arc)对比,若备库最大是 102,那 103–105 全丢; - 确认主库网络、存储、实例全不可达 —— 不是“连接超时”,而是
tnsping失败、ssh连不上、甚至机房断电。只要主库还有半点恢复可能,就该走switchover而非failover。
DGMGRL failover to 的实际操作流程
满足上述条件后,才进 dgmgrl 执行,顺序不能错:
- 用
SYSDG连接备库:dgmgrl sysdg@stby_db(密码需明文,不能用 wallet); - 检查配置状态:
show configuration,确保显示Configuration Status: SUCCESS,若有WARNING先处理; - 执行强制接管:
failover to "stby_db"—— 注意引号必须有,名称严格匹配show configuration输出中的备库名; - 成功后立即验证:
SELECT OPEN_MODE FROM V$DATABASE应返回READ WRITE,且SELECT DATABASE_ROLE FROM V$DATABASE是PRIMARY。
failover 后最易被忽略的两件事
很多人以为 failover 成功就万事大吉,其实真正麻烦刚开始:
- 原主库必须物理隔离:拔网线、关机、甚至拆硬盘 —— 任何尝试重启或挂载的行为,都可能导致双主写冲突,损坏新主库数据文件;
- 应用连接必须立刻切走:DNS、TNS、应用配置里的连接串全部指向新主库,旧主库 IP 必须从负载均衡器中摘除,延迟哪怕 30 秒都可能引发脏写。











