FSFO自动切换测试前必须确认主库为PRIMARY、备库为PHYSICAL STANDBY且OPEN_MODE为READ ONLY WITH APPLY,LOG_ARCHIVE_DEST_STATE_2为ENABLE,且V$DATABASE中FSFO_STATUS为SYNCHRONIZED。
FSFO自动切换测试前必须确认的3个状态
fsfo不会在任意状态下响应断电,必须确保data guard配置已真正进入“就绪”状态。最常被忽略的是fsfo_status字段——它不是看status为enabled就完事,而是要查v$database里fsfo_status值为synchronized(非started或not synchronized)。
- 检查命令:
SELECT FSFO_STATUS, DATABASE_ROLE, PROTECTION_MODE FROM V$DATABASE; - 主库必须是
PRIMARY,备库必须是PHYSICAL STANDBY且OPEN_MODE为READ ONLY WITH APPLY -
LOG_ARCHIVE_DEST_STATE_2在主库上必须是ENABLE,且DB_UNIQUE_NAME与FSFO配置中完全一致(大小写敏感)
如果FSFO_STATUS显示STARTED,说明Observer尚未连上或心跳中断;此时直接断电,只会触发手动failover,不是FSFO。
模拟主库断电的正确操作顺序
真实断电不可控,但测试必须可控——不能直接shutdown abort,那会绕过DG协议,导致Observer判定为“异常终止”,可能拒绝自动failover。
- 先停掉主库监听和归档传输:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER;(避免日志堆积引发误判) - 再用
shutdown immediate关闭主库实例(这是最接近“断电但保留控制权”的方式) - 观察Observer日志:
tail -f /path/to/observer.log,关键信号是出现Initiating Fast-Start Failover和Switchover target is now the new primary - 备库角色变更后,检查
V$DATABASE.DATABASE_ROLE是否变为PRIMARY,且OPEN_MODE为READ WRITE
注意:shutdown abort会导致Observer看到ORACLE INSTANCE TERMINATED而非INSTANCE SHUTDOWN,大概率触发Failover cancelled: Primary instance terminated abnormally错误。
为什么Observer日志里一直卡在“Waiting for primary to become unavailable”
这不是Observer坏了,而是它收不到主库“失联”的明确信号。FSFO依赖Observer通过SQL*Net定期ping主库的DBMS_DG.INITIATE_FS_FAILOVER包,而这个包需要主库能响应基础SQL。
- 常见原因:防火墙拦截了Observer到主库1521端口的连接(即使tnsping通,也可能被状态检测规则阻断)
- 另一个坑:
FAST_START_FAILOVER_THRESHOLD默认是30秒,但Observer实际等待时间是threshold × 3(即90秒),期间只要有一次ping成功,计时重置 - 验证方法:在Observer机器上手动执行
sqlplus sys/<pwd>@primary_db as sysdba -c "SELECT 1 FROM DUAL;"</pwd>,如果超时或报ORA-12170: TNS:Connect timeout occurred,才符合FSFO触发条件
别改FAST_START_FAILOVER_THRESHOLD来“加速测试”——阈值太小会导致网络抖动误触发。
切换后应用连不上新主库?检查这3个地方
FSFO只改数据库角色,不改TNS别名、连接字符串或应用配置。
- 应用使用的
TNSNAMES.ORA里,服务名指向的IP仍是旧主库地址,需提前配好SCAN或使用ADDRESS_LIST轮询 - 如果用了Oracle Wallet或JDBC的
oracle.net.tns_admin,确保Wallet里服务别名对应的是当前主库的DB_UNIQUE_NAME - 最容易漏的一点:
listener.ora里SID_LIST_LISTENER没同步更新,导致新主库启动后监听不识别自己的GLOBAL_DBNAME,应用连接报ORA-12514: TNS:listener does not currently know of service requested
Observer不会动任何网络或监听配置,这部分纯靠你提前设计容灾路由。

















