单observer是单点故障,宕机或中断即导致fsfo失效;双observer需用不同os用户、独立配置文件但连接同一broker,通过fsfo_timeout、fsfo_threshold和reinstate_option三参数同步,并依赖broker内部状态协调避免冲突。

为什么单Observer不够用
Observer本质是独立进程,监控主备库心跳并触发自动故障转移;但它本身是单点——如果Observer所在主机宕机、网络中断或进程崩溃,Fast-Start Failover(FSFO)就完全失效,等同于退化为手动切换。Oracle官方不禁止部署多个Observer,但明确要求它们必须监听同一套DG配置,且不能同时发起failover动作。
两个Observer如何避免互相干扰
关键在DGMGRL连接方式和启动参数:两个Observer必须使用**不同操作系统用户**启动,且各自指定唯一-f配置文件路径;更重要的是,它们都必须连接到同一个Broker配置(即CONNECT sys/password@my_dg_config),而非各自维护副本。Broker内部通过DBA_DG_OBSERVER_CONFIGURATION视图统一记录当前活跃Observer状态,自动拒绝第二个Observer的ENABLE FAST_START FAILOVER请求——除非第一个已离线超时(由FSFO_TIMEOUT参数控制,默认30秒)。
- Observer A启动命令:
dgmgrl -f /u01/app/oracle/observer_a.conf - Observer B启动命令:
dgmgrl -f /u01/app/oracle/observer_b.conf - 两个.conf文件内容一致,仅
CONNECT语句指向同一Broker配置名
Observer配置文件里必须显式设置的三项
漏掉任意一项,双Observer会无法识别彼此或误判状态:
-
FSFO_TIMEOUT = 45:建议设为45秒以上,避免网络抖动导致误切;两个Observer需保持一致 -
FSFO_THRESHOLD = 30:主库连续30秒未响应心跳才触发failover,同样需同步 -
REINSTATE_OPTION = AUTO:确保故障转移后原主库能自动重建为新备库,否则第二个Observer可能因角色不一致拒绝接管
注意:FSFO_TIMEOUT和FSFO_THRESHOLD必须在Broker配置中预先设置(EDIT DATABASE 'my_primary' SET PROPERTY FSFO_TIMEOUT=45),不能只写在.conf里。
验证双Observer是否真正生效
别只看SHOW CONFIGURATION VERBOSE里显示Fast-Start Failover: ENABLED——那只是开关状态。真正要盯的是:
- 查
V$DATAGUARD_PROCESS:两个Observer进程应分别出现在不同PROCESS列,STATUS为WAITING - 手动停掉一个Observer进程,等待
FSFO_TIMEOUT后执行SHOW FAST_START FAILOVER,确认Observer字段已切换为另一个IP/主机名 - 主库模拟宕机时,观察两个Observer日志(
$ORACLE_HOME/rdbms/log/drc*.log),只有其中一个会输出Initiating failover,另一个应记录Failover already in progress
最容易被忽略的是Observer与数据库之间的DNS解析一致性:两个Observer所在主机的/etc/hosts或DNS返回的主备库VIP解析必须完全相同,否则它们对“主库是否存活”的判断会出现分歧。











