fsfo在oracle 19c中启用前必须满足六个硬性前提:主备库均为19c+并打关键补丁、备库为read only with apply的物理备库、protection_mode一致、log_archive_dest_n配置正确、主备均启用flashback且空间充足、broker状态为success;staticconnectidentifier须含instance_name和server=dedicated,global_dbname须为_dgmgrl;v$database.fsfo_status必须为synchronized才真正就绪。

FSFO 在 Oracle 19c 中不是执行 ENABLE FAST_START FAILOVER 就算配好,绝大多数生产环境卡在 “Waiting for primary to become unavailable” 是因为 V$DATABASE.FSFO_STATUS 没到 SYNCHRONIZED,或者 Observer 根本连不上备库。
FSFO 启用前必须确认的六个硬性前提
缺一不可,否则 ENABLE FAST_START FAILOVER 会直接报错或后续静默失效:
- 主库和备库都运行在 Oracle 19c(或至少 12.2+),且已打关键补丁(如 19.20+)
- 备库必须是
PHYSICAL STANDBY,且当前OPEN_MODE为READ ONLY WITH APPLY(不是仅READ ONLY) - 主库
PROTECTION_MODE必须设为MAXIMUM AVAILABILITY或MAXIMUM PERFORMANCE;备库 Broker 配置中该值必须与主库一致(Broker 不会自动同步此属性) -
LOG_ARCHIVE_DEST_n上必须含VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLE)(主库)和VALID_FOR=(ONLINE_LOGFILES,STANDBY_ROLE)(备库),且传输模式为SYNC AFFIRM(最高可用性)或ASYNC(最高性能) - 主备库均启用
FLASHBACK DATABASE,且DB_RECOVERY_FILE_DEST有足够空间 - Broker 已启用:
SHOW CONFIGURATION返回状态为SUCCESS,无WARNING级别错误
StaticConnectIdentifier 配置错误是最常见的 Observer 连接失败原因
Observer 不走 TNS 别名解析,只认 StaticConnectIdentifier 里写的静态连接串——写错一个字符就卡死。
- 必须显式包含
(INSTANCE_NAME=orcl)和(SERVER=DEDICATED),例如:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.92)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=standby-01)(INSTANCE_NAME=orcl)(SERVER=DEDICATED)))
- 不能只写 IP+PORT+SERVICE_NAME,
INSTANCE_NAME缺失会导致 Observer 认为实例未注册 -
GLOBAL_DBNAME在 listener.ora 中必须为<db_unique_name>_DGMGRL</db_unique_name>(如standby-01_DGMGRL),否则 Broker 反向注册失败 - 用
dgmgrl手动测试:在 Observer 主机上运行CONNECT sys/password@<static_connect_string></static_connect_string>,成功才算真正通
Observer 启动后必须盯住 V$DATABASE.FSFO_STATUS
这个视图值才是 FSFO 实际就绪的唯一信号,SHOW CONFIGURATION 显示 ENABLED 只代表命令执行过。
-
SELECT FSFO_STATUS FROM V$DATABASE在主库和备库上都必须返回SYNCHRONIZED - 若为
NOT SYNCHRONIZED,先查V$DATAGUARD_STATS:看apply lag和transport lag是否持续 > 0;再查ARCHIVE_LAG_TARGET是否为 0(默认值),导致日志不主动切换、延迟不暴露 - Observer 日志路径固定为
$ORACLE_HOME/rdbms/log/drc*.log,首次启动失败时第一个要翻它,重点搜TNS-12541、ORA-12170、ORA-16664 -
START OBSERVER必须在 Observer 主机本地终端执行,SSH 远程调用或后台 nohup 启动均无效——进程会立即退出
FSFO 切换失败时优先验证的三处原始信号
别急着重启 Observer 或重跑 ENABLE,先看底层状态是否真实健康:
- 查
V$DATAGUARD_STATS:VALUE 列中apply lag和transport lag必须稳定为 0 且不反弹;若持续增长,说明 redo 没传过去或没应用 - 查
V$MANAGED_STANDBY:STATUS 列应为APPLYING_LOG,PROCESS 应含MRP0;若为WAIT_FOR_LOG或IDLE,Real-Time Apply 实际已停 - 查
V$FS_FAILOVER_STATS:重点关注FAILOVER_THRESHOLD(当前设的秒数)、FAILOVER_DELAY(实际延迟)、LAST_STATUS_CHANGE_TIME(最后一次状态变更时间)
真正麻烦的点不在配置语法,而在于 Observer 对网络、监听、实例名、服务名的校验极其严格,且所有检查都是静默的——它不会告诉你哪一步错了,只会卡在 “Waiting for primary to become unavailable”。最省时间的做法是:先确保 V$DATABASE.FSFO_STATUS = SYNCHRONIZED,再确认 Observer 日志里没有连接类报错,最后才去触发故障模拟。











