dgmgrl不是开箱即用工具,必须先确保dg_broker_start=TRUE、监听器静态注册_DGMGRL服务、tnsnames.ora中connect identifier匹配DB_UNIQUE_NAME且主备库归档模式启用,否则无法连接或执行任何命令。

dgmgrl 不是开箱即用的自动化工具,它只在所有底层参数、网络和服务全部就绪后才开始工作;配置失败几乎全是前置条件缺失导致的,不是命令写错了。
为什么 dgmgrl 连不上主库或备库
连不上就什么都做不了,dgmgrl 默认不带身份认证,直接敲 dgmgrl 回车会连本地默认实例(可能根本不是 DG 环境里的库),或者用操作系统认证(/)但没切到 oracle 用户。
- 主库侧必须用具有
SYSDBA权限的用户连接,推荐:dgmgrl sys/<i>password</i>@<i>primary_db_unique_name</i> - 备库同理,注意:
db_unique_name要和init.ora或SPFILE里配置的一致,不是服务名(service_name)或实例名(instance_name) - 报错
ORA-12154: TNS could not resolve the connect identifier?说明$ORACLE_HOME/network/admin/tnsnames.ora缺失对应条目,或条目名拼写错误
CREATE CONFIGURATION 前必须确认的三件事
这一步失败率极高,Broker 不校验环境是否就绪,只检查参数值是否“看起来对”。缺一不可:
-
DB_UNIQUE_NAME必须在主备库都已设置且互不相同(不能沿用默认ORCL),查法:SHOW PARAMETER db_unique_name -
LOG_ARCHIVE_CONFIG必须包含双方的DB_UNIQUE_NAME,例如:'DG_CONFIG=(pri,sto)'—— 缺一个就报ORA-16625: cannot reach database -
LOG_ARCHIVE_DEST_2(或更高编号)必须指向备库,且SYNC/ASYNC、VALID_FOR、DB_UNIQUE_NAME全部匹配;漏掉DB_UNIQUE_NAME=sto是高频坑 - 主库必须处于
OPEN状态,备库必须是MOUNT(非READ ONLY)
ENABLE CONFIGURATION 卡住或报 ORA-16792 怎么办
启用不是原子操作,Broker 会逐项检查资源状态。卡住意味着某项依赖未就绪,而不是命令本身有问题:
- 最常见是备库的
ARCHIVE LOG LIST显示Archive Mode: Disabled—— Broker 要求主备都必须归档模式 - 执行
SELECT DATABASE_ROLE, OPEN_MODE, PROTECTION_MODE FROM V$DATABASE;,确保主库是PRIMARY、备库是PHYSICAL STANDBY;如果备库是READ ONLY,先SHUTDOWN IMMEDIATE再STARTUP MOUNT -
ORA-16792通常伴随子错误,比如ORA-16810: multiple errors or warning,需看SHOW DATABASE VERBOSE 'standby_db_name'输出的具体告警 - 监听器必须支持
GLOBAL_DBNAME为db_unique_name_DGMGRL.db_domain,否则DGMGRL连不上备库;改完监听要lsnrctl reload
dg_broker_start=TRUE 没生效就别试了
这是最容易被忽略的启动开关,Broker 进程根本不会起来,所有 dgmgrl 操作都会返回 “configuration status is unknown” 或直接拒绝连接:
- 主备库都要执行:
ALTER SYSTEM SET dg_broker_start=TRUE SCOPE=BOTH;,然后重启实例(或至少SHUTDOWN IMMEDIATE+STARTUP) - 验证方式:用
sqlplus / as sysdba登录后执行SHOW PARAMETER dg_broker_start,双端都必须显示TRUE - Broker 配置文件(
dg_broker_config_file1/dg_broker_config_file2)路径由SHOW PARAMETER dg_broker_config_file1查看,损坏后需先停 Broker 再重建,物理日志传输不受影响
真正麻烦的从来不是 CREATE CONFIGURATION 或 ENABLE CONFIGURATION 这几行命令,而是每个 DB_UNIQUE_NAME 大小写是否一致、每个 tnsnames.ora 条目是否指向正确的 GLOBAL_DBNAME、每个 LOG_ARCHIVE_DEST_n 的 DB_UNIQUE_NAME 是否拼对 —— 这些细节不校验,Broker 就当它们不存在。


















