dgmgrl连不上broker配置是因为dg_broker_start默认为false,需主备库均执行alter system set dg_broker_start=true并重载监听;且db_unique_name须全局唯一、listener.ora需静态注册,备库须mount状态并启用归档,log_archive_dest_state_n须enable。
为什么 dgmgrl 连不上 broker 配置?
Broker 不是自动启用的,哪怕 Data Guard 物理备库已搭建好,dgmgrl 默认也连不到任何配置 —— 因为 dg_broker_start 参数默认是 FALSE。不手动打开,Broker 进程根本不会启动。
- 主库和备库都必须显式设置:
ALTER SYSTEM SET dg_broker_start=TRUE; - 设置后需重启监听(或至少 reload),否则
dgmgrl用connect sys@db1 as sysdba能连实例,但查不到 Broker 配置 - 检查是否生效:查询
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'dg_broker_start';,返回TRUE才算到位
创建配置时提示 ORA-16501 或 ORA-16528
这类错误基本锁定在静态注册与数据库唯一名(DB_UNIQUE_NAME)不一致。Broker 要求主备库的 DB_UNIQUE_NAME 必须全局唯一,且 listener.ora 中的 SID_LIST 必须显式包含该唯一名,不能只靠动态注册。
- 确认主备库各自的
DB_UNIQUE_NAME(不是DB_NAME):SELECT DB_UNIQUE_NAME FROM V$DATABASE; - 在每台机器的
$ORACLE_HOME/network/admin/listener.ora里,为对应实例补全静态注册段,例如:SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl_primary) (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1) (SID_NAME = orcl) ) ) - 修改后执行
lsnrctl reload,再用lsnrctl status看输出里是否有Service "orcl_primary"这一行
ADD DATABASE 失败:备库状态不是 MOUNT 或没开归档
Broker 添加备库时会尝试连接并校验其状态,常见卡点就两个:备库没到 MOUNT 状态,或者归档模式未开启(ARCHIVELOG)。
- 备库必须处于
MOUNT状态(不能OPEN READ ONLY,也不能NOMOUNT):SHUTDOWN IMMEDIATE; STARTUP MOUNT; - 主库和备库都必须是归档模式:
ARCHIVE LOG LIST输出里要有Database log mode: Archive Mode - 如果刚切归档,记得执行一次
ALTER SYSTEM ARCHIVE LOG CURRENT;,确保归档进程真正跑起来,否则 Broker 初始化时可能报 IO 超时
配置完却无法 SWITCHOVER:日志传输没真通
Broker 显示配置正常、状态为 SUCCESS,但一执行 SWITCHOVER TO 就 hang 住或报 ORA-16766(Redo Transport Service is offline),本质是主库没把归档日志实时传过去。
- 检查主库归档目标是否指向备库:
SHOW PARAMETER log_archive_dest_2,值里必须含SERVICE=standby_db(注意 service 名要和tnsnames.ora里定义的一致) - 确保主库
log_archive_dest_state_2是ENABLE,不是DEFER或RESET - 在主库手动触发一次归档:
ALTER SYSTEM ARCHIVE LOG CURRENT;,然后立刻去备库查:SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED='YES';,如果这个值没变,说明传输链路根本没走通
Broker 的配置只是“登记表”,真正起作用的是底层归档传输 + 应用机制。参数设对了、服务名拼对了、监听通了、状态对了——这四样少一个,dgmgrl 就只是个能敲命令的空壳。最容易被忽略的是静态监听注册和 log_archive_dest_state_n 的实际开关状态,这两处出问题,现象就是一切看起来都对,但就是不干活。










