必须部署两个observer实例,因oracle要求至少两个observer达成投票共识(quorum)才允许执行fast-start failover,这是防脑裂的硬性机制;单点observer宕机将导致fsfo立即变为disabled状态。

Observer 不是装完就能用的服务,它必须和 Data Guard Broker 配合、且至少两个实例协同工作才能生效。单个 Observer 实例部署后,Fast-Start Failover 会直接停摆——不是“可能不触发”,而是 Oracle 内部强制拒绝批准切换。
为什么必须部署两个 Observer 实例?
Oracle 要求至少两个 Observer 达成投票共识(quorum)才允许执行 Failover。这是防脑裂的硬性机制:
- 单点
Observer宕机 →Fast-Start Failover立即变为DISABLED状态,后续主库故障时不会自动切换 - 两个
Observer必须部署在不同物理节点或可用区,禁止共用主机、同一网络出口或共享存储 - 它们不主从、不同步状态,各自独立运行
DGMGRL START OBSERVER命令,靠心跳和投票判断彼此存活 -
Observer本身不参与日志传输或应用,只监听主库、备库及另一个Observer的角色与连接状态
Observer 启动前必须确认的 Broker 配置项
启动 Observer 前,Broker 配置必须已启用且主备库状态正常,否则 DGMGRL 会报 ORA-16664 或连接超时:
-
CONNECT IDENTIFIER对应的 TNS 服务名,其GLOBAL_DBNAME必须为db_unique_name_DGMGRL(例如orcl_primary_DGMGRL),不是普通服务名 - 主库和备库的
LOG_ARCHIVE_DEST_2必须设置VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE),且DB_UNIQUE_NAME匹配 Broker 中定义的名称 - 运行
SHOW CONFIGURATION VERBOSE后,确认Fast-Start Failover显示为DISABLED(这是初始状态,开启需后续命令) - 主备库的
FAILOVER_THRESHOLD和REINSTATE参数需一致,否则 failover 后备库无法自动 reinstated
如何启动两个独立 Observer 实例?
每个 Observer 实例必须在不同服务器上,用独立会话运行,不能复用同一套环境变量或监听端口:
- 在节点 A 执行:
DGMGRL> START OBSERVER observer1,日志默认写入$ORACLE_HOME/dbs/observer1.log - 在节点 B 执行:
DGMGRL> START OBSERVER observer2,日志路径需手动指定避免冲突,例如:START OBSERVER observer2 LOGFILE '/u01/app/oracle/observer2.log' - 启动后立即检查:
SHOW FAST_START FAILOVER应显示ENABLED,且OBSERVERS列出两个实例名 - 任意一个
Observer进程异常退出,Broker 会在FAILOVER_THRESHOLD秒内尝试重连;若两个都失联,FSFO 自动降级为DISABLED
常见失败现象与定位方式
Observer 启动成功不代表 FSFO 可用,实际切换失败往往卡在底层连通性或角色识别上:
- 现象:
SHOW FAST_START FAILOVER显示DISABLED,但DGMGRL没报错 → 检查主备库v$database.DATABASE_ROLE是否为PRIMARY/PHYSICAL STANDBY,非此值则 Observer 拒绝介入 - 现象:Observer 日志中反复出现
Unable to contact database 'xxx'→ 确认该数据库的监听器已重载(lsnrctl reload),且GLOBAL_DBNAME在listener.ora中正确配置 - 现象:两个 Observer 启动后,
SHOW FAST_START FAILOVER中OBSERVERS只显示一个 → 检查两节点间 TCP 1521 端口双向互通,以及tnsnames.ora中对方服务名是否可解析并连接 - 现象:手动触发
FAILOVER TO 'standby_db'报ORA-16666: fast-start failover is disabled→ 说明当前配置未真正启用 FSFO,需先执行ENABLE FAST_START FAILOVER,且确保 Observer 已就绪











