RAC+ADG必须使用Data Guard Broker,因RAC多节点日志传输需DMON统一调度LOG_ARCHIVE_DEST_n及角色切换,手动配置会导致ORA-16789/ORA-16664等错误且状态不一致。
直接用 dgmgrl 配置 data guard broker 是唯一可行路径,手动维护 log_archive_dest_n、alter database 切换等操作在 rac 环境下必然失败——rac 主库多节点日志传输必须由 broker 统一调度,否则会出现 ora-16789(未配置重做传输服务)或 ora-16664(无法联系主库)。
为什么 RAC + ADG 必须用 Broker 而非手写 SQL
RAC 主库不是单实例,每个节点都可能生成重做日志,而物理备库只接受一个“逻辑主库”身份的归档流。Broker 通过 DMON 进程协调所有 RAC 实例的 LGWR 或 ARCH 进程,统一绑定 LOG_ARCHIVE_DEST_2 到指定 DB_UNIQUE_NAME,并确保切换时所有节点同步角色变更。手动方式无法做到这点:你改了一个节点的参数,其他节点仍按旧配置归档;你在一个节点执行 ALTER DATABASE COMMIT TO SWITCHOVER,其余节点状态不一致,MRP 进程直接报错停摆。
常见错误现象:
-
ORA-16789:Broker 检测到 RAC 主库中至少一个实例未启用重做传输服务 -
ORA-16664:备库尝试连接主库时,监听器返回“unknown service”,本质是GLOBAL_DBNAME不匹配 - Switchover 后主库部分节点仍处于
MOUNT状态,无法自动OPEN
配置前必须验证的 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>,例如rac_primary_DGMGRL.example.com
漏掉最后一条最典型:tnsnames.ora 里能连通,dgmgrl 却提示 ORA-12154,因为 Broker 启动数据库时依赖这个特定服务名,而非普通 SERVICE_NAME。
DGMGRL 创建配置时 CONNECT IDENTIFIER 的真实含义
CONNECT IDENTIFIER 不是 TNS 别名,而是 tnsnames.ora 中定义的、指向目标实例的网络服务名,且该服务名对应的监听器必须注册了 <db_unique_name>_DGMGRL 全局名。
实操要点:
- 主库执行:
CREATE CONFIGURATION 'my_dg' AS PRIMARY DATABASE IS 'rac_primary' CONNECT IDENTIFIER IS rac_primary; - 备库执行:
ADD DATABASE 'rac_standby' AS CONNECT IDENTIFIER IS rac_standby MAINTAINED AS PHYSICAL; - tnsnames.ora 中
rac_primary和rac_standby必须分别指向主 RAC SCAN VIP 和备库监听地址,CONNECT_DATA.SERVICE_NAME填的是普通服务名(如rac_primary),但监听器后台必须同时注册rac_primary_DGMGRL - 切勿用实例名(如
rac_primary1)或节点 IP 直连,Broker 要求高可用抽象层
容易踩的坑:LOG_ARCHIVE_DEST_2 参数里写的 SERVICE=rac_standby 必须与这里 CONNECT IDENTIFIER 完全一致,Broker 启用配置时会校验两者是否对齐。
启用 Fast-Start Failover 前的致命检查项
单纯执行 ENABLE FAST_START FAILOVER 必然报 ORA-16651,因为 Broker 默认不信任你的网络和闪回配置。
必须提前确认:
- 主备库均开启闪回数据库:
ALTER DATABASE FLASHBACK ON;(非可选,FSFO 强制要求) - 备库已启用实时应用(
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;) - 部署独立 observer(不在主备服务器上),且 observer 能同时解析主备的
CONNECT IDENTIFIER -
FS_FAILOVER_THRESHOLD设为合理值(单位秒),默认 30 秒太短,易被瞬时网络抖动触发误切
最关键的忽略点:RAC 环境下 observer 必须使用 SCAN 名称连接主库,不能写单节点 VIP,否则 failover 时只能拉起一个节点,其余节点卡在 MOUNT。


















