fsfo触发阈值需平衡误切与晚切,非越小越好;应基于链路p95延迟(如800ms则设15–20秒)、确保fsfo_status为synchronized,并reload observer生效。

FSFO 触发阈值不是“越小越好”,而是要匹配网络抖动容忍窗口
设置 FastStartFailoverThreshold 本质是在“误切”和“晚切”之间找平衡点。设成 5 秒,可能因瞬时网络抖动(如交换机微秒级丢包)就触发切换;设成 120 秒,主库真宕机后业务已中断两分钟。Oracle 官方建议值是 30 秒,但这个数字必须结合你的真实链路质量校准。
查清当前链路真实延迟和抖动,再定阈值
Observer 判断主库“不可用”,依据的是它自己到主库的连接是否超时,而不是 Broker 或数据库内部心跳。所以不能只看 tnsping,得模拟 Observer 行为:
- 在 Observer 主机上用
dgmgrl手动连主库:dgmgrl sys/password@primary_db,反复执行,观察平均耗时和最大波动 - 用
sqlplus / as sysdba在主库执行SELECT SYSDATE FROM V$DATABASE;,同时在 Observer 主机用date对比时间差,连续测 5 分钟,记录 P95 延迟 - 检查主备间网络设备(特别是跨机房/跨 AZ 场景)是否有 QoS 限速、ACL 临时拦截、防火墙会话老化等隐性干扰
若 P95 延迟是 800ms,那 FastStartFailoverThreshold 至少设为 10 秒(建议 15–20 秒),留出 2–3 倍余量。
阈值生效前必须确认 FSFO_STATUS 是 SYNCHRONIZED
V$DATABASE.FSFO_STATUS 不是装饰字段——它实时反映 Observer 底层连接健康度。即使你设了 FastStartFailoverThreshold = 30,只要该视图返回 NOT SYNCHRONIZED,Observer 就根本不会启动倒计时。常见原因:
- 主库归档传输卡住:查
V$ARCHIVE_DEST_STATUS的STATUS和ERROR列,LOG_ARCHIVE_DEST_2状态为ERROR会直接拖垮 FSFO_STATUS - 备库没开 Real-Time Apply:运行
SELECT OPEN_MODE FROM V$DATABASE,结果必须含READ ONLY WITH APPLY,光是READ ONLY不行 - StaticConnectIdentifier 指向了错误实例名:Broker 要求该参数里显式带
(INSTANCE_NAME=),且值必须与V$INSTANCE.INSTANCE_NAME完全一致
改阈值后必须 reload observer,不能只改配置就完事
通过 EDIT DATABASE 'standby_db' SET PROPERTY 'FastStartFailoverThreshold' = 45 修改后,Broker 配置虽已更新,但正在运行的 observer 进程仍按旧值计时。必须手动 reload:
- 登录 observer 主机,进
dgmgrl:dgmgrl / - 执行
STOP OBSERVER(注意不是KILL -9,要让它优雅退出) - 再执行
START OBSERVER - 立刻查日志:
tail -f $ORACLE_HOME/rdbms/log/drc*.log,确认新进程启动后没有ORA-16664或连接拒绝类报错
最容易被忽略的一点:observer 日志里出现 Waiting for primary to become unavailable 并不意味着阈值没生效,而大概率是 FSFO_STATUS 卡在非 SYNCHRONIZED,此时调低阈值毫无意义——得先让状态绿起来。











