oracle 12c rac+adg自动切换必须使用data guard broker(dgmgrl),因rac多节点日志传输需dmon统一调度log_archive_dest_n及角色切换,手动配置会导致ora-16789/ora-16664等错误且状态不一致。

Oracle 12c Data Guard 主备自动切换必须依赖 Data Guard Broker(dgmgrl),手动配置无法实现真正意义上的自动切换,尤其在 RAC 环境下会直接失败。
为什么 dgmgrl 是唯一可行路径
RAC 主库有多个实例,每个都可能生成重做日志,但物理备库只能接受一个逻辑主库的归档流。Broker 的 DMON 进程负责协调所有 RAC 实例的 LGWR 或 ARCH,统一绑定 LOG_ARCHIVE_DEST_2 到指定 DB_UNIQUE_NAME,并在角色切换时同步所有节点状态。手动改参数或执行 ALTER DATABASE COMMIT TO SWITCHOVER 只影响当前连接的实例,其余节点仍按旧配置归档,必然触发:
-
ORA-16789:Broker 检测到至少一个 RAC 实例未启用重做传输服务 -
ORA-16664:备库连接主库时监听器返回 “unknown service”,本质是GLOBAL_DBNAME不匹配 - Switchover 后部分节点卡在
MOUNT状态,无法自动OPEN
dgmgrl 配置前必须硬性验证的 4 项
Broker 启动后不会主动校验这些,但首次 ENABLE CONFIGURATION 就会失败,缺一不可:
-
DB_UNIQUE_NAME在主备端显式设置且互不相同(不能用默认ORCL),RAC 所有节点共享同一值 - 主备库均启用
ENABLE PLUGGABLE DATABASE(12c+ 强制,即使没建 PDB 也得开) -
LOG_ARCHIVE_CONFIG包含双方DB_UNIQUE_NAME,例如:'DG_CONFIG=(rac_primary,rac_standby)' - 监听器静态注册
GLOBAL_DBNAME = <db_unique_name>_DGMGRL.<db_domain></db_domain></db_unique_name>,例如:rac_primary_DGMGRL.example.com
漏掉最后一条最常见:tnsnames.ora 能连通,dgmgrl 却报 ORA-12154,因为 Broker 重启数据库时依赖这个特定服务名,而非普通 SERVICE_NAME。
启用 Broker 自动切换的关键步骤
确认上述 4 项满足后,按顺序执行:
- 主备库均执行:
ALTER SYSTEM SET DG_BROKER_START=TRUE SCOPE=BOTH,并确认ps -ef | grep dmon存在进程 - 用
dgmgrl登录主库:dgmgrl sys/<pwd>@rac_primary</pwd>,然后运行:CREATE CONFIGURATION 'myconf' AS PRIMARY DATABASE IS 'rac_primary' CONNECT IDENTIFIER IS rac_primary; - 添加备库:
ADD DATABASE 'rac_standby' AS CONNECT IDENTIFIER IS rac_standby MAINTAINED AS PHYSICAL; - 启用配置:
ENABLE CONFIGURATION—— 此步失败说明前面 4 项仍有遗漏 - 启动自动故障转移(可选):
EDIT DATABASE 'rac_primary' SET PROPERTY FS_FAILOVER_THRESHOLD=30;,再ENABLE FAST_START FAILOVER
后续 switchover/failover 全部通过 SWITCHOVER TO 'rac_standby' 或 FAILOVER TO 'rac_standby' 一条命令完成,Broker 自动处理所有节点状态同步、日志应用、数据库启停。
真正容易被忽略的是监听器里那个带 _DGMGRL 后缀的 GLOBAL_DBNAME 静态注册 —— 它不是可选项,而是 Broker 启动数据库时的唯一入口,手误少写一个字符或域名不一致,整个自动流程就卡死在连接阶段。











