rac主库配rac备库报ora-16789或ora-16664,根本原因是备库cluster_database=true导致broker无法确定mrp执行节点,引发角色协商失败;必须设cluster_database=false并重启整个rac。

不能直接用“RAC to RAC”物理DG实现跨机房容灾,必须搭配Far Sync或ADG+Broker,并且备库RAC需关闭cluster_database参数才能启用FSFO。
为什么RAC主库配RAC备库会报ORA-16789或ORA-16664
RAC主库的每个节点都默认参与日志传输,但DG Broker在RAC备库上启动MRP(Managed Recovery Process)时,会尝试连接所有实例——如果备库仍以集群模式运行(cluster_database=TRUE),Broker无法确定由哪个节点执行应用,直接拒绝启用配置。错误不是网络不通,而是角色协商失败。
- 验证方式:
SELECT DATABASE_ROLE, OPEN_MODE, PROTECTION_MODE FROM V$DATABASE在备库任一节点执行,若返回PHYSICAL STANDBY但OPEN_MODE为MOUNTED,且DGMGRL SHOW CONFIGURATION报ORA-16664,基本可判定是cluster_database未关闭 - 正确做法:在备库所有节点执行
ALTER SYSTEM SET cluster_database=FALSE SCOPE=SPFILE,然后重启数据库(不是单个实例,是整个RAC shutdown + startup) - 注意:这不会让备库变单实例——ASM、OCR、Voting Disk仍存在,只是DG进程只在一个节点上运行,其他节点仅作监听和连接转发
LOG_ARCHIVE_DEST_n参数在RAC主库上怎么配才不踩坑
RAC主库必须为每个归档目标单独配置LOG_ARCHIVE_DEST_n,且VALID_FOR必须明确绑定角色与日志类型,否则DG Broker识别不到传输路径,DGMGRL ENABLE CONFIGURATION会静默失败。
- 主库SPFILE中至少要包含:
LOG_ARCHIVE_CONFIG='DG_CONFIG=(rac_primary,rac_standby)' -
LOG_ARCHIVE_DEST_2='SERVICE=rac_standby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=rac_standby'—— 这里SERVICE=rac_standby必须指向备库SCAN或VIP,不能写单节点IP - 不要省略
VALID_FOR;若写成VALID_FOR=(ALL_LOGFILES,ALL_ROLES),切换后主库可能误向自己归档,引发循环归档 - 所有RAC节点共用同一SPFILE,参数修改后无需逐节点执行
ALTER SYSTEM,但必须确认SHOW PARAMETER log_archive_dest_2在所有节点返回一致结果
Far Sync实例为什么不能部署在主库机房
Far Sync本质是redo中继,它不存数据文件、不跑业务,但必须物理隔离——如果和主库同机房,就失去“跨机房容灾”的意义;如果和备库同机房,则无法判断是主库故障还是网络中断,导致误触发failover。
- 部署位置唯一合理选择:第三地(异地机房),且网络延迟稳定≤5ms(Oracle官方建议)
- Far Sync实例必须用
LGWR SYNC AFFIRM模式,否则无法保证RPO=0;配置命令:ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=far_sync LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=far_sync' SCOPE=BOTH - Far Sync节点不需要ASM、不需要OCR,甚至可以装在VM里;但必须和主库同版本、同
COMPATIBLE值,否则ALTER DATABASE START FAR SYNC INSTANCE会报ORA-16826 - 别试图把Far Sync和备库合并在一台机器上——Oracle不允许,
DGMGRL ADD FAR_SYNC会校验platform_id,相同则拒绝
ADG备库RAC开启只读后,查询走的是哪个节点
Active Data Guard备库即使为RAC架构,也只有一个节点运行MRP进程并提供只读服务,其余节点只做连接代理。客户端连接SERVICE_NAME时,SCAN监听器会把请求路由到MRP所在节点,不会负载均衡到其他空闲节点。
- 确认MRP所在节点:
SELECT INST_ID, PROCESS, STATUS FROM GV$MANAGED_STANDBY WHERE PROCESS = 'MRP0',只有一行返回INST_ID - 客户端TNS应配置
LOAD_BALANCE=OFF,否则部分连接可能连到无MRP的节点,报ORA-16000: database open for read-only access但查不到数据 - 如果真需要多节点并发查询,只能用逻辑standby(但功能受限)或GoldenGate(许可成本高)——物理ADG的“只读分担”本质是单点能力扩展,不是集群级扩展
最易被忽略的一点:Far Sync和备库的DB_UNIQUE_NAME不能相同,哪怕只差一个下划线,DGMGRL也会在ENABLE CONFIGURATION阶段校验失败,报错信息却只显示“configuration not ready”,实际要查SELECT * FROM V$DATAGUARD_STATUS里的具体原因字段。











