FSFO_STATUS=ENABLED仅表示功能启用过,不等于自动切换就绪;真正触发条件是FSFO_STATUS=SYNCHRONIZED、DATABASE_ROLE=PRIMARY、PROTECTION_MODE为MAXIMUM AVAILABILITY或MAXIMUM PROTECTION,且备库开启Real-Time Apply、主库启用FLASHBACK DATABASE。

FSFO_STATUS=ENABLED ≠ 自动切换就绪
查到 V$DATABASE.FSFO_STATUS 返回 ENABLED 就以为配置成功?这是最典型的误判。这个字段只表示“FSFO 功能被启用过”,不反映当前心跳、同步或 observer 连通状态。
真正决定能否触发的是实时值:SYNCHRONIZED 才代表 observer 已连上主备库、日志传输正常、心跳稳定;STARTED 说明 observer 进程已启动,但还没完成对主库的首次 ping(常见于防火墙拦截或 DBMS_DG.INITIATE_FS_FAILOVER 调用失败);NOT SYNCHRONIZED 则意味着日志延迟超限、备库没开 Real-Time Apply,或 FastStartFailoverLagLimit 设置太小。
- 必须执行:
SELECT FSFO_STATUS, DATABASE_ROLE, PROTECTION_MODE FROM V$DATABASE;—— 三者必须同时为SYNCHRONIZED、PRIMARY、MAXIMUM AVAILABILITY或MAXIMUM PROTECTION -
PROTECTION_MODE是硬性前提:在MAXIMUM PERFORMANCE下,FSFO 直接被禁用,不管其他配置多完美 - 物理备库必须是
OPEN_MODE = READ ONLY WITH APPLY;逻辑备库或冷备完全不支持 FSFO
Observer 日志卡在 “Waiting for primary to become unavailable”
这不是 observer 坏了,是它收不到主库“真挂了”的信号。FSFO 依赖 observer 每隔 FastStartFailoverThreshold 秒(默认 30)调用一次 DBMS_DG.INITIATE_FS_FAILOVER,而这个包需要主库能响应基础 SQL*Net 连接。
- 防火墙可能放行了
tnsping,但拦截了实际 SQL 包——尤其针对状态检测类规则(如只允许 SELECT,拒绝 PL/SQL 包调用) - 主库监听器虽运行,但
LOCAL_LISTENER或REMOTE_LISTENER配置错误,导致 observer 的连接被拒绝而非超时,observer 无法区分“挂了”和“拒绝” -
FAST_START_FAILOVER_THRESHOLD=30不代表 30 秒后就切——实际等待窗口是 threshold × 3(即 90 秒),期间只要有一次 ping 成功,计时重置 - 查日志路径:
$ORACLE_HOME/rdbms/log/drc*.log,重点搜Initiating Fast-Start Failover或Failed to ping primary
shutdown immediate 不会触发 FSFO
这是最常被踩的坑。FSFO 只响应非正常中断:shutdown immediate、shutdown normal、shutdown transactional 都不会触发——因为这些命令会主动通知 Broker 主库即将退出,Broker 直接进入“受控停机”流程,跳过故障判定。
- 测试必须用
kill -9或直接断电模拟真实宕机;用shutdown abort也行,但它会破坏实例一致性,仅限测试环境 - 主库监听器停止、网络中断、存储不可达等外部故障才可能触发;单纯数据库进程 kill 掉,observer 仍可能连得上监听器,误判为主库存活
- 确认 observer 是否真连上了主库:在 observer 主机上执行
sqlplus /@primary_db,看是否能登录并执行SELECT 1 FROM DUAL;不能则说明网络或监听层已断
备库未启用 Real-Time Apply 或 FLASHBACK DATABASE
FSFO 自动切换要求备库必须开启 RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE,且主库必须启用 FLASHBACK DATABASE。缺一不可。
- 检查备库是否在实时应用:
SELECT RECOVERY_MODE FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;—— 必须返回MANAGED REAL TIME APPLY,不是IDLE或MANAGED STANDBY - 主库未开 flashback 会导致 observer 在切换前校验失败,日志里会出现
ORA-38701: Flashback database is not enabled -
LOG_ARCHIVE_DEST_n必须含VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLE)和备库对应VALID_FOR=(ONLINE_LOGFILES,STANDBY_ROLE);漏掉任一VALID_FOR,broker 内部状态就会不一致 - StaticConnectIdentifier 在 broker 中必须可解析、监听正常;常见问题是
tnsnames.ora缺失条目,或GLOBAL_DBNAME与DB_UNIQUE_NAME不匹配,导致 observer 连不上备库


















