FSFO自动切换需同时满足五项硬性前提:启用FLASHBACK DATABASE、LOG_ARCHIVE_DEST_n含合法VALID_FOR、PROTECTION_MODE为MAXIMUM AVAILABILITY/PERFORMANCE、备库为PHYSICAL STANDBY且OPEN_MODE=READ ONLY WITH APPLY、V$DATABASE.FSFO_STATUS=SYNCHRONIZED;缺一则Observer卡在“Waiting for primary to become unavailable”。
oracle 19c 的 fsfo 自动切换不是“配完就生效”,它依赖 observer 持续心跳、主备状态同步、以及底层网络与权限链路全部就绪——缺一不可,否则断电后只会卡在 waiting for primary to become unavailable。
FSFO 前置条件:为什么 SHOW CONFIGURATION 显示 ENABLED 却不自动切
FSFO 不是开关式功能,它有一组硬性前提必须同时满足,任意一项不达标,Observer 就不会发起切换:
-
FLASHBACK DATABASE必须启用(ALTER DATABASE FLASHBACK ON),FSFO 故障恢复流程会用它回退异常主库; - 主库和备库的
LOG_ARCHIVE_DEST_n中,必须显式包含VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLE)和VALID_FOR=(ONLINE_LOGFILES,STANDBY_ROLE),否则 Broker 无法识别传输路径合法性; - 主备库的
PROTECTION_MODE必须为MAXIMUM AVAILABILITY或MAXIMUM PERFORMANCE(19c 支持后者 FSFO); - 备库必须是
PHYSICAL STANDBY,且OPEN_MODE为READ ONLY WITH APPLY(不能是 MOUNTED); -
V$DATABASE.FSFO_STATUS必须为SYNCHRONIZED,不是STARTED或NOT SYNCHRONIZED—— 这个值才是 Observer 实际判断依据。
dgmgrl 配置流程:所有操作必须走 Broker,SQL*Plus 无效
FSFO 完全由 Data Guard Broker 管理,任何 SQL*Plus 手动命令(如 ALTER DATABASE COMMIT TO SWITCHOVER)都不会触发自动行为。典型操作顺序如下:
- 用
dgmgrl连接主库 Broker:dgmgrl sys/password@primary_db(注意:不是连数据库实例,而是 Broker 监听地址); - 确认配置健康:
SHOW CONFIGURATION输出必须为Success,且无 WARNING; - 设置阈值(单位秒):
EDIT DATABASE 'standby_db' SET PROPERTY 'FastStartFailoverThreshold' = 30; - 启用 FSFO:
ENABLE FAST_START FAILOVER; -
关键一步:在独立 observer 主机上执行
dgmgrl -silent "START OBSERVER"(必须本地执行,远程 SSH 调用无效)。
Observer 启动后默认日志写入 $ORACLE_HOME/rdbms/log/drc*.log,这是排障第一现场。
Observer 连不上?90% 是网络或监听配置问题
Observer 日志里反复出现 Waiting for primary to become unavailable,不是 Broker 配置错,而是 Observer 根本没收到主库失联信号。常见原因:
- 防火墙放行了
tnsping,但拦截了DBMS_DG.INITIATE_FS_FAILOVER的 SQL*Net 包(通常走 1521 端口,需允许 TCP 状态检测通过); - 备库的
tnsnames.ora缺失standby_db条目,或条目中HOST写成 localhost/127.0.0.1,导致 Observer 从主库视角无法反向连接备库; - 备库监听未启动,或未注册到监听器(
lsnrctl status查不到该 DB_UNIQUE_NAME 对应的服务名); -
FastStartFailoverThreshold设为 30 秒,但 Observer 实际等待窗口是 threshold × 3(即 90 秒),期间只要有一次 ping 成功,计时重置——所以不要只看一次失败。
测试 FSFO 切换:shutdown immediate 是唯一安全模拟方式
别用 shutdown abort 测试,它会让 Observer 认为主库异常终止,直接报错 Failover cancelled: Primary instance terminated abnormally。正确步骤:
- 先在主库停归档传输:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER; - 再执行
shutdown immediate(这是最贴近“断电但可控”的方式); - 立刻盯住 observer 日志:
tail -f $ORACLE_HOME/rdbms/log/drc*.log,关键线索是出现Initiating Fast-Start Failover和Switchover target is now the new primary; - 切换完成后,登录原备库查:
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE,应为PRIMARY+READ WRITE。
真正容易被忽略的是:Observer 进程本身没有高可用,它挂了整个 FSFO 就失效;建议用 systemd 或 supervisord 守护它,而不是裸跑。


















