ORA-16820 表示 observer 进程已超心跳超时(默认30分钟)失联,导致快速启动故障转移悬停;需检查网络、日志、清理残留配置,再用正确参数重启并验证同步状态。

ORA-16820 报错说明 observer 已失联
这个错误不是警告,是明确信号:observer 进程已超过心跳超时阈值(默认 30 分钟),不再向主库或备库发送心跳。此时 fast-start failover 处于“悬停”状态——既不会自动触发 failover,也无法响应手动干预。
常见现象包括:DGMGRL SHOW CONFIGURATION 中 observer 状态显示为 NOT RUNNING 或空白;SHOW DATABASE VERBOSE 里 Fast-Start Failover 字段仍为 ENABLED,但实际已失效;尝试 SWITCHOVER 或 FAILOVER 命令会报 ORA-16664 或直接超时。
- 别急着重启 observer:先确认它是否真挂了,还是网络/防火墙阻断了监听端口(默认 8080)
- 检查 observer 日志:
$ORACLE_HOME/rdbms/log/dg_observer.log,重点看最后几行是否有Connection refused、timeout或ORA-12170 - 验证 observer 所在主机能否
tnsping通主库和备库的CONNECT IDENTIFIER,且对应监听器中 GLOBAL_DBNAME 必须带_DGMGRL后缀(如orcl_primary_DGMGRL)
停止残留 observer 并清理配置残留
observer 进程可能已僵死但未完全退出,或 broker 配置里还存着旧 observer 地址。不清理就直接重启,大概率触发 ORA-16664 或新 observer 无法注册。
- 在任意已连接 broker 的节点上执行:
DGMGRL CONNECT sys/password@primary_db,再运行STOP OBSERVER—— 即使提示 “no observer running”,也强制执行一次 - 检查
SHOW CONFIGURATION VERBOSE输出中Observer Host和Observer Net Address字段,若非空,用EDIT CONFIGURATION SET PROPERTY ObserverHost=''清空 - 确认主库和备库的
LOG_ARCHIVE_DEST_2参数里没有残留 observer 相关设置(如SYNC AFFIRM NET_TIMEOUT=30中的NET_TIMEOUT值过小会导致频繁断连)
重新启动 observer 的关键参数组合
observer 启动命令看似简单,但参数顺序和权限细节极易出错。最常踩的坑是:observer 跑在非 Oracle 用户下、监听地址绑定错、或没指定 -d 参数指向正确 broker 配置文件。
- 必须用 Oracle software owner 用户启动:
dg_observer -d $ORACLE_HOME/dbs/dr1<code>ORACLE_SID.dat -o /tmp/dg_observer.log -h 0.0.0.0:8080 -
-d参数必须指向主库上的 broker 配置文件(dr1<code>ORACLE_SID.dat),不能是备库的副本 -
-h指定监听地址时,别写成localhost或127.0.0.1—— observer 需要被主备库双向访问,应绑定0.0.0.0或具体网卡 IP - 启动后立刻验证:
ps -ef | grep dg_observer确认进程存在;netstat -tlnp | grep :8080确认端口监听;再回到DGMGRL执行SHOW CONFIGURATION,观察 observer 状态是否变为RUNNING
observer 恢复后必须验证的三个动作
observer 进程跑起来只是第一步。它必须完成与主备库的完整握手,并同步当前保护组状态,否则仍无法参与故障切换决策。
- 等待至少 2 分钟,让 observer 自动完成初始状态同步(日志里会出现
Observer started successfully和Database status synchronized) - 在
DGMGRL中执行VALIDATE DATABASE verbose 'primary_db'和VALIDATE DATABASE verbose 'standby_db',确认返回结果无Warning或Error - 手动触发一次心跳测试:
EDIT DATABASE 'primary_db' SET PROPERTY 'HeartbeatTimeout' = '60'(临时调高超时),再改回原值,观察 observer 是否能实时响应
observer 对网络延迟极其敏感,哪怕单向延迟超过 NET_TIMEOUT 设置值,就会反复断连。生产环境建议把 observer 部署在独立、低延迟的第三站点,而不是主备库任一节点上。


















