dgmgrl随oracle数据库软件提供,位于$oracle_home/bin/;启动失败需检查$oracle_home与$path设置;ora-12154因仅读$oracle_home/network/admin/tnsnames.ora;ora-16664主因监听未注册db_unique_name_dgmgrl服务。
dgmgrl 不是独立安装的组件,它随 oracle 数据库软件一并提供,无需额外安装。只要数据库版本是 11.2.0.x(如 11.2.0.3 或 11.2.0.4),且已正确安装 oracle rdbms 软件,dgmgrl 可执行文件就位于 $oracle_home/bin/ 目录下。
dgmgrl 启动失败或提示“command not found”
- 检查
$ORACLE_HOME是否已正确设置,且$ORACLE_HOME/bin已加入$PATHecho $ORACLE_HOME which dgmgrl
- 若返回空,说明环境变量未生效,需在
~/.bash_profile中补全:export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1 export PATH=$ORACLE_HOME/bin:$PATH
- 不要尝试从其他版本(如 12c)复制
dgmgrl二进制文件到 11g 环境——版本不兼容会导致连接后立即断开或报ORA-12547: TNS:lost contact
连接时反复报 ORA-12154: TNS:could not resolve the connect identifier
这个错误和常规 SQL*Plus 不同,DGMGRL 对 TNSNAMES.ORA 的加载路径更严格:
- 它只认
$ORACLE_HOME/network/admin/tnsnames.ora,不读取$TNS_ADMIN指向的其他位置(除非显式指定) - 主库与备库的
tnsnames.ora必须双向可解析:- 主库能通过别名(如
orcl)连自己,也能通过别名(如standby)连备库 - 备库同理,必须能解析
orcl和standby
- 主库能通过别名(如
- 别名对应的
SERVICE_NAME必须是db_unique_name_DGMGRL(不是db_name或普通 service),例如:orcl = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = orcldb1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl_DGMGRL) ← 关键:必须含 _DGMGRL ) )
配置多节点 RAC + 物理备库时,DGMGRL 报 ORA-16664: unable to receive the result from a database
这是 Broker 通信失败的典型表现,根源往往不在网络连通性,而在监听配置:
- 每个 RAC 实例(包括备库的每个节点)的
listener.ora中,必须为每个实例注册一个GLOBAL_DBNAME = <db_unique_name>_DGMGRL</db_unique_name>条目
例如两节点 RAC 主库orcl(db_unique_name=orcl):SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl_DGMGRL) ← 必须有 (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = orcl1) ) (SID_DESC = (GLOBAL_DBNAME = orcl_DGMGRL) ← 同样必须有,不能省略第二个 (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = orcl2) ) ) - 缺少任一实例的
_DGMGRL注册,Broker 就无法完成全拓扑发现,后续show configuration会卡住或显示不全
复杂容灾拓扑(比如一主两备、级联备库、RAC+ADG混合)真正难的不是命令本身,而是每个数据库节点上 _DGMGRL 监听注册、tnsnames.ora 解析闭环、以及 dg_broker_start=true 同步启用这三件事必须严丝合缝——漏掉任意一个节点的一个 _DGMGRL 条目,整个 Broker 配置就会处于“半瘫痪”状态:能连上,但 show 不出完整拓扑,switchover 会静默失败。











