跨机房rac容灾中dg网络必须隔离三类流量,主备库需专用物理网卡或vlan承载redo传输;log_archive_dest_2须设valid_for=(all_logfiles,primary_role)覆盖所有thread;密码文件须含sysbackup权限并手动同步;dg传输不可用scan监听,须配静态监听服务。

跨机房RAC容灾中DG网络必须隔离三类流量
主备库之间不能共用RAC心跳网或ASM管理网,否则DG日志传输会受集群内部通信抖动干扰,出现ORA-16789(未配置重做传输服务)或MRP0进程频繁中断。实际部署中,至少要划出第三张物理网卡(或VLAN)专用于DG redo transport。
常见错误现象:
- 主库
ARCH进程持续报LGWR: Standby redo log not available,但备库监听正常 -
DGMGRL显示STATUS = ORA-16664,TRANSPORT LAG持续增长且不收敛
正确做法:
- 主库两节点各配独立DG专用IP(如
172.16.10.101/172.16.10.102),绑定到新网卡,不参与GI集群发现 - 备库同样配对应DG IP(如
172.16.20.101/172.16.20.102),与主库网段不重叠、路由可达 - TNSNAMES.ORA中
SERVICE=rac_standby必须指向备库SCAN VIP或双节点VIP列表,不能写单节点IP或localhost
LOG_ARCHIVE_DEST_n的VALID_FOR必须匹配RAC多线程场景
RAC主库有多个redo thread(通常每个实例一个),若LOG_ARCHIVE_DEST_2只设VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE),则仅thread 1的日志会被传输,thread 2日志堆积导致ARCH挂起。这是ORA-16038和归档无法切换的常见根因。
必须显式覆盖全部thread:
- 主库所有节点统一执行:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=rac_standby ASYNC VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=rac_standby' SCOPE=BOTH; -
VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLE)确保所有thread的online log和standby log都参与传输 - 备库端对称配置
LOG_ARCHIVE_DEST_2指回主库,DB_UNIQUE_NAME填主库的DB_UNIQUE_NAME(不是实例名)
验证命令:SELECT DEST_ID, STATUS, VALID_NOW, VALID_TYPE, VALID_ROLE FROM V$ARCHIVE_DEST WHERE DEST_ID = 2;,确认VALID_NOW为YES且VALID_TYPE含ALL_LOGFILES。
密码文件同步遗漏SYSBACKUP权限会导致DG Broker连接失败
RAC主备各节点的orapw<sid></sid>文件必须完全一致,且必须包含SYSBACKUP权限——DG Broker在switchover时会以SYSBACKUP身份连接远端实例。若只用orapwd生成默认密码文件,该权限缺失,Broker报ORA-01017: invalid username/password并拒绝启用配置。
实操要点:
- 在主库任一节点生成带权限密码文件:
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID entries=10 force=y format=12.2 sysbackup=y - 用
scp逐个复制到所有主备节点相同路径,覆盖原文件(注意$ORACLE_SID在RAC中是实例名,如21crac1) - 检查各节点:
strings $ORACLE_HOME/dbs/orapw$ORACLE_SID | grep -i backup,应输出SYSBACKUP
容易被忽略的是:即使使用ASM存储密码文件,也必须手动同步,GI不会自动广播该文件。
SCAN监听器不能直接用于DG传输,必须额外配静态监听
SCAN VIP是负载均衡入口,DG日志传输要求稳定、可预测的连接目标。若TNSNAMES.ORA中SERVICE=rac_standby只定义SCAN地址(如(ADDRESS=(PROTOCOL=TCP)(HOST=rac21c-scan)(PORT=1521))),Broker可能将redo发往不同节点,触发ORA-16191(主备时间戳不一致)。
正确方式是为DG传输单独配置静态监听:
- 在备库两节点的
$GRID_HOME/network/admin/listener.ora中,为每个节点添加独立静态服务名,例如:SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = racdg_DGMGRL) (ORACLE_HOME = /oracle/db11g) (SID_NAME = 21crac1))) - TNSNAMES.ORA中改用该静态服务:
(CONNECT_DATA = (SERVICE_NAME = racdg_DGMGRL)) - 主库
LOG_ARCHIVE_DEST_2的SERVICE值必须与这个静态SERVICE_NAME严格一致
复杂点在于:静态监听名不能和数据库实例名重复,也不能用GLOBAL_DBNAME等于DB_UNIQUE_NAME,否则Broker初始化时会混淆角色。











