ORA-16620真实含义是Broker无法从数据库获取有效状态,而非配置未同步;主因是监听未注册_DGMGRL服务、dg_broker_start未生效或数据库角色/状态异常。
ORA-16620 真实含义不是“配置未同步”,而是 Broker 无法从数据库获取有效状态
ora-16620 的错误提示是 ora-16620: failed to retrieve status for database "xxx",但它**不表示配置文件内容不一致**,而是 dgmgrl 进程(dmon)尝试连接目标库、读取 v$database 或 broker 内部状态视图时失败。常见原因有三类:监听服务缺失、dg_broker_start 实际未生效、或数据库角色/状态异常(比如备库处于 mount 但未开启接收日志)。尤其注意:rac 环境下只在一个节点启 dg_broker_start 不够,所有实例都必须设为 true,否则 dgmgrl 会随机连到某个实例并报这个错。
检查监听是否真正注册了 _DGMGRL 服务
DG Broker 必须通过监听器访问数据库,且要求监听里静态注册 GLOBAL_DBNAME = <db_unique_name>_DGMGRL.<db_domain>。很多人改了 listener.ora 却忘了 reload,或把 SID_NAME 和 GLOBAL_DBNAME 顺序写反(Oracle 11g+ 对顺序敏感),导致服务没起来。
-
lsnrctl status输出中必须看到类似oradg_DGMGRL.localdomain的服务名,且状态为READY - 确认
listener.ora中该 SID_DESC 块里SID_NAME是真实实例名(如oradg1),不是 DB_NAME;GLOBAL_DBNAME后缀必须是_DGMGRL,不能是_DGB或_DG - RAC 环境下,每个节点的监听器都要单独配置并
lsnrctl reload,不能只配一个节点
暴力清理前先确认 dmon 进程和配置文件状态
遇到 ORA-16620,别急着删文件。先看 dmon 是否真在跑:ps -ef | grep dmon;再查参数是否落地:show parameter dg_broker_start —— 注意 scope 是 BOTH,否则重启后失效。如果参数为 FALSE 或进程不存在,alter system set dg_broker_start=true scope=both 后等 10 秒再试 dgmgrl,常能直接恢复。
- 若
dmon存在但反复挂掉,检查告警日志里是否有ORA-16625(无法连库)或ORA-16623(角色变更冲突),这说明底层数据库状态不稳定,Broker 无法协商 - 配置文件(如
+DATA/<db>/dgbroker/<db>_config1.ora)不要手动删,除非确认dg_broker_start=false且无其他实例依赖它;误删可能让后续重建卡在 “configuration exists but invalid” 状态
重建配置时最易忽略的两个硬性前提
即使清掉了配置文件、关了 dg_broker_start,重新 create configuration 之前,必须满足两个条件,否则仍报 ORA-16620:
- 主库和备库的
log_archive_config必须包含双方的DB_UNIQUE_NAME,例如'DG_CONFIG=(orcl,orcl_stby)',缺一不可;否则 Broker 根本不认为这是合法 Data Guard 对 - 主库和备库的保护模式必须一致:
select protection_mode, protection_level from v$database;若一边是MAXIMUM PERFORMANCE,另一边是RESYNCHRONIZATION,Broker 会拒绝启用,此时需先用edit configuration set protection mode as MAXPERFORMANCE统一
这些检查点没有命令能自动跳过,漏掉任何一个,DGMGRL 就会停在“连得上但读不到状态”的死循环里。

















