Fast-Start Failover启用需满足六项前提:Oracle 10gR2+版本、启用Real-Time Apply、配置Data Guard Broker、LOG_ARCHIVE_DEST_n含正确VALID_FOR、StaticConnectIdentifier可解析且网络连通、observer进程持续在线。
Fast-Start Failover 依赖哪些前提条件
fsfo 不是开箱即用的功能,必须满足几个硬性条件才能启用。缺一不可,否则 enable fast_start failover 会直接报错。
- 主库和备库必须运行在 Oracle 10gR2 及以上版本(推荐 12cR2+ 或 19c,旧版本存在已知 Bug)
- 必须启用 Real-Time Apply(即备库使用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE) - 必须配置 Data Guard Broker(
dgmgrl),FSFO 完全由 Broker 管理,SQL*Plus 手动命令无法触发自动切换 - 主库与备库的
LOG_ARCHIVE_DEST_n中必须包含VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLE)和对应备库的VALID_FOR=(ONLINE_LOGFILES,STANDBY_ROLE) - Broker 配置中,主库和备库的
StaticConnectIdentifier必须可解析、监听正常,且能被对方数据库进程访问(常因防火墙或tnsnames.ora缺失导致连接超时)
如何用 dgmgrl 配置并启用 FSFO
所有操作必须通过 dgmgrl 连接 Broker 配置,不能混用 SQL*Plus。典型流程是先校验、再设阈值、最后启用。
- 连接 Broker:
dgmgrl sys/password@primary_db(注意:这里连接的是主库的 Broker 监听地址,不是数据库实例) - 检查当前状态:
SHOW CONFIGURATION→ 确认状态为SUCCESS;SHOW DATABASE VERBOSITY→ 确保无WARNING级别错误 - 设置 FSFO 参数:
EDIT DATABASE 'standby_db' SET PROPERTY 'FastStartFailoverThreshold' = 30(单位秒,表示主库连续不可达 30 秒后触发) - 指定 observer 主机:
START OBSERVER(需提前在独立主机上运行dgmgrl -silent "START OBSERVER",observer 进程必须始终在线,否则 FSFO 不生效) - 启用 FSFO:
ENABLE FAST_START FAILOVER→ 成功后SHOW CONFIGURATION会显示Fast-Start Failover: ENABLED
注意:START OBSERVER 命令必须在 observer 主机本地执行,远程调用无效;observer 日志默认写入 $ORACLE_HOME/rdbms/log/drc*.log,故障时第一个要看这里。
FSFO 触发失败的三个高频原因
即使配置完成,实际故障时仍可能卡在“等待”或“失败回退”。常见问题不在 SQL 层,而在网络与权限链路上。
-
ORA-16664: unable to receive the result from a database:observer 能连主库但连不上备库(比如备库监听未启动、tnsnames.ora中 standby_db 条目指向错误、或备库未注册到监听器) - 切换卡在
WAITING FOR REDO:主库崩溃前最后一段 redo 未传到备库,而备库又没启用实时应用(USING CURRENT LOGFILE),导致 observer 判定“数据不一致”,拒绝切换 - observer 进程意外退出后未自启:Linux 下建议用 systemd 托管,避免仅靠 nohup 启动;Windows 下必须以服务方式安装,否则用户登出后 observer 终止
验证与模拟切换是否真有效
不要等到生产故障才试。定期用可控方式验证,但必须避开业务高峰,并确保有回切预案。
- 手动触发测试切换:
FAILOVER TO 'standby_db'(在 observer 在线前提下),该命令会绕过自动检测逻辑,强制执行一次 FSFO 流程 - 观察主库是否真的 shutdown abort:切换后原主库实例应已终止(
ps -ef | grep pmon查不到),而非仅断开连接 - 检查新主库的
DB_UNIQUE_NAME和SWITCHOVER_STATUS:SELECT DB_UNIQUE_NAME, SWITCHOVER_STATUS FROM V$DATABASE,结果应为新角色 +NOT ALLOWED(表示当前是主库) - 切回原主库需先重建为物理备库:
REINSTATE DATABASE 'primary_db'→ 成功后再FAILOVER TO 'primary_db',不能直接 STARTUP MOUNT
observer 的存活和网络可达性是整个机制的单点瓶颈,它不参与日志传输,但决定“什么时候该切”——这点最容易被忽略。










