fsfo触发需同时满足三类条件:阈值超时(faststartfailoverthreshold)、健康检查项(如corrupted controlfile)和oracle错误码列表(如ora-00600),缺一不可;且v$database.fsfo_status必须为synchronized,protection_mode须为maximum availability或maximum performance,主备库均须启用flashback database。

FSFO 触发条件必须显式配置,不是默认启用
FSFO 不是“配完 Broker 就自动生效”的功能。即使 SHOW CONFIGURATION 显示 Fast-Start Failover: ENABLED,只要 Observer 没启动、或主备状态不满足硬性前提,它就永远不会触发切换——只会卡在 Waiting for primary to become unavailable。
真正决定是否触发的,是以下三类条件的**同时满足**:
-
FastStartFailoverThreshold:主库与 Observer、目标备库均失联超过该秒数(如设为30) - 健康检查项(
Health Conditions):如Corrupted Controlfile、Datafile Write Errors等,默认部分启用,需用EDIT DATABASE ... SET PROPERTY 'LogXptMode' = ...类命令确认 - Oracle 错误码列表(
Oracle Error Conditions):默认为空,需手动添加如ORA-00600、ORA-07445等关键内部错误
如何用 dgmgrl 查看和修改当前触发条件
所有操作必须通过 dgmgrl 连接 Broker(不能用 SQL*Plus),且连接的是 Broker 监听地址(如 sys/password@broker_primary),不是数据库实例名。
查看当前配置:
dgmgrl> SHOW FAST_START FAILOVER
输出中重点关注这几项:
-
Threshold:当前阈值(单位秒),默认 30 -
Observer:是否已启动;若为(none),FSFO 实际不可用 -
Health Conditions表格:每行末尾的YES/NO表示该条件是否参与触发 -
Oracle Error Conditions:若显示(none),说明任何 ORA 错误都不会触发 FSFO
修改阈值(以备库 standby_db 为例):
dgmgrl> EDIT DATABASE 'standby_db' SET PROPERTY 'FastStartFailoverThreshold' = 45
启用某项健康检查(如 Inaccessible Logfile):
dgmgrl> EDIT DATABASE 'primary_db' SET PROPERTY 'InaccessibleLogfile' = 'ENABLE'
添加 Oracle 错误触发(注意语法必须带单引号):
dgmgrl> EDIT DATABASE 'primary_db' SET PROPERTY 'OracleErrorConditions' = "'ORA-00600','ORA-07445'"
为什么 SHOW FAST_START FAILOVER 显示 ENABLED 却不响应故障
最常见原因不是配置遗漏,而是状态链断裂。FSFO 的实际判断依据不在 Broker 配置层,而在运行时视图和底层连通性:
-
V$DATABASE.FSFO_STATUS必须为SYNCHRONIZED(不是STARTED或NOT SYNCHRONIZED),否则 Observer 拒绝发起切换 -
StaticConnectIdentifier在主库和备库两端都必须可解析、监听正常、且能双向 telnet 通(常因tnsnames.ora缺失或防火墙拦截导致ORA-16664) - Observer 进程必须在**独立主机**上本地运行:
dgmgrl -silent "START OBSERVER";远程 SSH 执行或后台 nohup 启动但未重定向日志,会导致进程静默退出 - Observer 日志默认写入
$ORACLE_HOME/rdbms/log/drc*.log,故障时第一个要查的就是这个路径下的最新日志
PROTECTION_MODE 和 FLASHBACK 是硬门槛,改错会直接阻断启用
这两项不是“建议开启”,而是 ENABLE FAST_START FAILOVER 命令执行时的校验点。任一不满足,命令会报错并中止:
-
PROTECTION_MODE必须为MAXIMUM AVAILABILITY或(Oracle 19c 起支持)MAXIMUM PERFORMANCE;设成MAXIMUM PROTECTION反而不行 -
FLASHBACK DATABASE必须在主库和备库**都启用**:ALTER DATABASE FLASHBACK ON;仅主库开没用,备库也得开,且DB_RECOVERY_FILE_DEST和大小必须已配置 - 切记:启用
FLASHBACK后,必须执行一次SWITCHOVER或重启备库使其进入READ ONLY WITH APPLY状态,V$DATABASE.FSFO_STATUS才可能变为SYNCHRONIZED
这些检查点藏在后台,不报具体字段名,只甩一句 ORA-16827: Flashback Database is disabled 或 ORA-16819: fast-start failover observer not started —— 容易让人误以为只是 observer 没启,其实根源在 flashback 或 protection mode。











