必须清空log_archive_dest_2等手工参数,否则broker拒绝启用配置;ora-16664/ora-16532根因是监听器未注册_dgmgrl服务名,需在listener.ora中静态注册并执行lsnrctl reload验证。

直接用 DGMGRL 配置多备库是可行的,但必须先清掉 LOG_ARCHIVE_DEST_2 等手工归档参数,否则 Broker 会拒绝启用配置。
为什么创建配置时总卡在 ORA-16664 或 ORA-16532
这两个错误基本都指向同一个根因:Broker 连不上目标库。不是网络不通,而是监听器没配对 GLOBAL_DBNAME。
-
CONNECT IDENTIFIER必须对应tnsnames.ora中一个真实可用的服务名,且该服务名在监听器里注册的GLOBAL_DBNAME必须是<db_unique_name>_DGMGRL.<domain></domain></db_unique_name>(注意末尾固定加_DGMGRL) - 主库监听里要注册
orcl_primary_DGMGRL,备库监听里要注册orcl_standby_DGMGRL,不能只写orcl_primary - 改完
listener.ora后必须执行lsnrctl reload,lsnrctl status要能看到对应GLOBAL_DBNAME条目 - 检查
LOG_ARCHIVE_CONFIG是否包含所有库的DB_UNIQUE_NAME,例如:'DG_CONFIG=(orcl_primary,orcl_standby,orcl_cascade)'
添加第二个物理备库时,RedoRoutes 怎么设才不冲突
RedoRoutes 是替代 LOG_ARCHIVE_DEST_n 的核心属性,但它只在 Broker 启用后才生效,且必须显式设置——Broker 不会自动推导路由。
- 默认情况下,主库会向所有已
ADD的物理备库发送日志;若要限制,必须手动配置:EDIT DATABASE 'orcl_primary' SET PROPERTY RedoRoutes='(orcl_standby:ALTERNATE:orcl_cascade)'; - 如果想让
orcl_cascade只从orcl_standby接收日志(级联模式),而不是主库直传,得在主库上设:EDIT DATABASE 'orcl_primary' SET PROPERTY RedoRoutes='(orcl_standby:SYNC); (orcl_cascade:ALTERNATE:orcl_standby)'; - 注意语法:冒号分隔目标库和传输模式,多个路由用分号分隔,括号不能省;设错会导致
SHOW DATABASE VERBOSE里Log Xpt Mode显示DISABLED -
RedoRoutes修改后立即生效,无需重启库或 Broker,但需确认ARCH进程已开始往新路径发日志(查v$archive_dest_status)
DG_BROKER_CONFIG_FILE1/2 路径为什么必须放在 ASM(RAC 环境下)
RAC 多实例共享一份 Broker 配置,如果文件放在本地文件系统,各节点读到的可能是不同版本,导致 DMON 进程状态不一致、ENABLE CONFIGURATION 失败或角色切换卡住。
- 主库 RAC 必须设为:
ALTER SYSTEM SET DG_BROKER_CONFIG_FILE1='+datadg/orcl/DATAGUARDCONFIG/dgb_config1.ora' SCOPE=BOTH SID='*'; - 备库 RAC 同理,但路径要独立(不能和主库共用同一 ASM 目录),否则 failover 后新主库可能读到旧配置
- 路径中
DATAGUARDCONFIG是惯例命名,非强制,但目录权限必须允许 Oracle 用户读写 - 首次启用
dg_broker_start=TRUE后,Broker 会自动创建这两个文件;若手动 touch 出空文件,Broker 会拒绝启动
最容易被忽略的是 DB_UNIQUE_NAME 和 GLOBAL_DBNAME 的命名一致性——哪怕只差一个下划线或大小写,Broker 就连不上备库,而错误日志里不会直接告诉你哪里不匹配,只会报超时或拒绝连接。











