fsfo在oracle 19c中并非启用即生效,必须满足v$database.fsfo_status=synchronized、staticconnectidentifier配置正确、主备库均启用flashback database且为physical standby read only with apply等全部前提,缺一则observer卡在“waiting for primary to become unavailable”。

FSFO(Fast-Start Failover)在 Oracle 19c 中不是配完 ENABLE FAST_START FAILOVER 就自动生效的,Observer 进程一旦掉线、网络不通、或主备状态未同步,切换就会卡死在 Waiting for primary to become unavailable —— 这是生产环境最常被忽略的“假启用”状态。
Observer 启动失败的三个高频原因
Observer 日志($ORACLE_HOME/rdbms/log/drc*.log)里反复出现连接超时或认证失败,90% 源于以下三点:
-
StaticConnectIdentifier配置错误:必须显式包含(INSTANCE_NAME=...)和(SERVER=DEDICATED),仅写 IP+PORT+SERVICE_NAME 不够;用dgmgrl手动测试:CONNECT sys/password@primary_db成功 ≠ Observer 能连,它走的是静态监听路径 - 主备库未配置 DGMGRL 专用静态服务名:
listener.ora中SID_DESC的GLOBAL_DBNAME必须为<db_unique_name>_DGMGRL</db_unique_name>(如orcl_primary_DGMGRL),否则 Broker 无法反向注册 - Observer 主机未安装 Oracle 数据库软件:19c 要求 Observer 主机上必须有同版本
ORACLE_HOME,且tnsnames.ora、sqlnet.ora全部就位;远程 SSH 执行dgmgrl -silent "START OBSERVER"无效,必须本地终端运行
V$DATABASE.FSFO_STATUS = SYNCHRONIZED 才算真正就绪
这个视图值才是 Observer 实际判断依据,不是 SHOW CONFIGURATION 显示 ENABLED 就万事大吉。常见误判场景:
- 主库归档传输中断超过
LOG_ARCHIVE_DEST_n的REOPEN间隔,FSFO_STATUS会退为NOT SYNCHRONIZED,但ARCHIVE_LAG_TARGET默认为 0,不主动触发日志切换,容易被忽视 - 备库
OPEN_MODE是READ ONLY而非READ ONLY WITH APPLY:必须确认SELECT OPEN_MODE FROM V$DATABASE返回值含WITH APPLY字样,否则 Real-Time Apply 未真正在跑 - 主备库
PROTECTION_MODE不一致:主库设为MAXIMUM AVAILABILITY,备库却仍是MAXIMUM PERFORMANCE(通过 Broker 修改后需SWITCHOVER或重启生效)
FSFO 切换失败时最先查什么
故障发生后,别急着重启 Observer 或重跑 ENABLE,先盯住三处原始信号:
- 查
V$DATAGUARD_STATS:重点看VALUE列中apply lag和transport lag是否持续增长;若 > 0 且不回落,说明日志没真正传过去 - 查
V$MANAGED_STANDBY:确认PROCESS=MRP0的STATUS是APPLYING_LOG,不是WAIT_FOR_LOG或CONNECTED - 查 Observer 日志末尾:搜索
ORA-16664(收不到备库响应)或ORA-12170(TNS 连接超时)—— 这两类错误直接对应网络或监听层问题,和 SQL 层配置无关
Observer 不是守护进程,它不自动拉起、不自动重连、不自动修复配置偏差。哪怕只漏掉一个 _DGMGRL 静态服务名,或 FLASHBACK DATABASE 某次被手动关过没再开,整个 FSFO 链路就形同虚设。真实环境里,80% 的“自动切换失败”其实发生在故障前两周——那时 FSFO_STATUS 就已经悄悄变成 NOT SYNCHRONIZED 了。











