fsfo自动切换需同时满足五个硬性条件:主备库均启用flashback database;log_archive_dest_n含对应valid_for;protection_mode为maximum availability或maximum performance;备库为physical standby且open_mode为read only with apply;v$database.fsfo_status必须为synchronized。
fsfo 不是配完 enable fast_start failover 就能自动切的,observer 卡在 “waiting for primary to become unavailable” 是最常见假成功现象——背后大概率是五个硬性条件里至少缺一个。
为什么 SHOW CONFIGURATION 显示 ENABLED 却不自动切换
Broker 的 ENABLED 状态只代表开关打开了,不代表 FSFO 实际就绪。真正决定能否触发的是 V$DATABASE.FSFO_STATUS 字段值,必须为 SYNCHRONIZED。如果它是 STARTED 或 NOT SYNCHRONIZED,Observer 就不会发号施令。
-
FLASHBACK DATABASE必须在主库和备库都执行ALTER DATABASE FLASHBACK ON(不是只开主库) -
LOG_ARCHIVE_DEST_n中必须同时含VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLE)(主库)和VALID_FOR=(ONLINE_LOGFILES,STANDBY_ROLE)(备库),Broker 才认传输路径合法 - 主备库
PROTECTION_MODE必须是MAXIMUM AVAILABILITY或MAXIMUM PERFORMANCE(19c 支持后者) - 备库必须是
PHYSICAL STANDBY,且OPEN_MODE为READ ONLY WITH APPLY(MOUNTED状态不行) -
V$DATABASE.FSFO_STATUS查询结果必须是SYNCHRONIZED;若为STARTED,说明 Observer 还没连上或心跳中断
Observer 启动失败的三个典型表现
Observer 必须在独立主机上运行,且全程保持进程存活。它不走远程调用,也不依赖 crontab 或 systemd 自启——一旦挂掉,FSFO 就失效。
- 日志里反复出现
Waiting for primary to become unavailable:不是 Observer 没启动,而是它 ping 主库的DBMS_DG.INITIATE_FS_FAILOVER包被防火墙拦截(即使tnsping通,也可能被状态检测规则阻断) -
dgmgrl里SHOW CONFIGURATION报ORA-16819: fast-start failover observer not started:说明 Broker 根本没收到 Observer 的注册心跳,检查 Observer 主机是否能解析主库 TNS 别名、监听端口是否开放、StaticConnectIdentifier是否配置正确 - Observer 日志(默认
$ORACLE_HOME/rdbms/log/drc*.log)里有Failed to connect to database或ORA-12170: TNS:Connect timeout occurred:重点查网络链路、tnsnames.ora条目是否缺失、监听器是否静态注册了GLOBAL_DBNAME=xxx_dgmgrl
ENABLE FAST_START FAILOVER 前必须确认的三件事
所有操作必须通过 dgmgrl 连接 Broker 执行,SQL*Plus 命令无效。顺序不能错,否则会报 ORA-16651: requirements not met for enabling fast-start failover。
- 先连 Broker:
dgmgrl sys/password@primary_db(注意是 Broker 监听地址,不是数据库实例) - 再验证配置:
SHOW CONFIGURATION输出必须是Success,无 WARNING;SHOW DATABASE 'standby_db' VERBOSITY确保无连接类错误 - 然后设阈值:
EDIT DATABASE 'standby_db' SET PROPERTY 'FastStartFailoverThreshold' = 30(单位秒,实际等待窗口是该值 × 3) - 最后启用:
ENABLE FAST_START FAILOVER—— 成功后SHOW CONFIGURATION中Fast-Start Failover行应显示ENABLED
测试时为什么 shutdown abort 反而失败
FSFO 触发依赖主库“优雅失联”信号。直接 shutdown abort 会让 Observer 收到 ORACLE INSTANCE TERMINATED 而非 INSTANCE SHUTDOWN,判定为主库异常崩溃,可能拒绝自动切换。
- 正确测试步骤:先在主库执行
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER(停归档传输,防日志堆积干扰判断),再执行shutdown immediate - 观察 Observer 日志是否出现
Initiating Fast-Start Failover和Switchover target is now the new primary - 切换后立刻查备库:
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE,确认角色变为PRIMARY、模式为READ WRITE - 别忘了检查原主库恢复后是否自动转为
PHYSICAL STANDBY并开始接收日志——这才是完整闭环
最容易被忽略的点是 FSFO_STATUS 字段和 Observer 日志位置。很多人只看 SHOW CONFIGURATION 的 ENABLED 就以为万事大吉,结果断电后卡死在 waiting 状态;排障时不查 $ORACLE_HOME/rdbms/log/drc*.log,光盯着 alert.log 或 dgmgrl 输出,永远找不到真实断点。











