ora-16664 根本不是网络超时,而是监听未注册 _dgmgrl 专用服务名导致连接被拒;需检查 listener.ora 静态注册、tnsnames.ora 中 service_name 大小写匹配、oracle 二进制权限(6751)、dmon 进程状态及双向 tns 连通性。
ora-16664 不是网络不通,是监听没认出 _dgmgrl 服务名
看到 ora-16664: unable to receive the result from a database 就去查防火墙、ping、tnsping 主库端口,基本白忙。这个错误秒报,说明请求根本没进数据库,卡在监听器拒绝阶段。
Broker 连接不走普通服务名(比如 orcl),它强制使用专用服务名:<db_unique_name>_DGMGRL</db_unique_name>(如 stest_DGMGRL)。监听器里没注册这个服务,就会直接拒连,最终抛出 ORA-16664。
- 执行
lsnrctl status,搜索输出中是否存在类似service "stest_DGMGRL"的条目 - 若无,检查
$ORACLE_HOME/network/admin/listener.ora,必须添加静态注册段:sid_list_listener = (sid_list = (sid_desc = (global_dbname = stest_DGMGRL) (oracle_home = /u01/app/oracle/product/19c/dbhome_1) (sid_name = stest) ) )
- 改完立刻执行
lsnrctl reload,再lsnrctl status确认服务已上线 -
SERVICE_NAME大小写敏感,tnsnames.ora里定义的CONNECT IDENTIFIER必须和global_dbname完全一致
主备库 dmon 进程都没跑,Broker 就是空壳
dg_broker_start=TRUE 只是“允许启动”,不代表 ora_dmon_<db_unique_name></db_unique_name> 进程真在跑。尤其备库上,dmon 会因依赖条件不满足而静默失败——比如控制文件未识别为 STANDBY 角色、归档未启用、或实例没到 MOUNT 状态。
- 主备库都执行:
ps -ef | grep dmon | grep -v grep,确认有对应进程 - 若无,先查
SHOW PARAMETER dg_broker_start是否真为TRUE(注意大小写和SCOPE) - 再查告警日志:
tail -50 $ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/alert_<instance_name>.log</instance_name></instance_name></db_name>,搜dmon或broker - 物理备库若处于
SHUTDOWN状态,必须先STARTUP MOUNT,dmon才可能拉起
show database verbose 才暴露真实断点,别只看 show configuration
show configuration 只告诉你“有警告”,show database verbose <db_unique_name></db_unique_name> 才能定位具体哪项不一致。Broker 的 WARNING 状态本质是元数据与真实参数/状态对不上,不是服务中断,但它拒绝自动修正。
- 重点关注输出里的三类字段:
InconsistentProperties、InconsistentLogXptProps、带(monitor)标记的字段(如LogXptStatus = '(monitor)') -
(monitor)表示 Broker 无法从数据库实时拉取该指标——常见于dmon进程异常、数据库未OPEN/MOUNT、或监听没注册_DGMGRL服务 - 若
StaticConnectIdentifier字段显示的连接串无法tnsping通,就先解决 TNS 解析问题,别急着EDIT DATABASE - 某些参数(如
DelayMins)在 spfile 里为空,但 Broker 元数据写了值,需先在 SQL*Plus 中ALTER SYSTEM SET DelayMins=30 SCOPE=BOTH,再同步配置
查不到 drc<db_unique_name>.log</db_unique_name>?Broker 可能压根没活
drc.log 默认在 $ORACLE_HOME/rdbms/trace/ 下,文件名是 drc<db_unique_name>.log</db_unique_name>(如 drcstest.log)。但前提是 dmon 进程已运行、目录可写、且配置文件路径有效。查不到日志,往往意味着 Broker 没真正启动。
- 先执行:
SELECT * FROM v$process WHERE program LIKE '%DMON%';,没结果就别翻日志了 - 确认
dg_broker_config_file1指向的路径(通常是两个.dat文件)对oracle用户可读写;RAC 环境下必须设在共享存储(如+DATA),否则初始化失败 - 临时加诊断:在
dgmgrl中执行SET LOG VERBOSE ON;,再运行ENABLE CONFIGURATION,错误会直接打到终端,不依赖日志文件 - 如果日志里反复出现
ORA-16631或ORA-16525,核心还是StaticConnectIdentifier连接失败,回到监听和服务名检查
Broker 配置是双向通信模型,主库配得再好,备库的 _DGMGRL 服务没注册、dmon 没跑、或 tnsnames.ora 里反向连接串写错,照样连不上。最容易被忽略的是:备库监听必须注册自己的 _DGMGRL 服务,且主库的 tnsnames.ora 必须能解析备库的这个服务名——不是单向通,是双向都要通。











