RMAN在Oracle RAC中默认只走单节点,因启动时随机连接一个实例(如用/ as sysdba或connect target /),所有通道均绑定该实例,导致I/O和CPU瓶颈;必须显式用CONNECT TARGET sys/oracle@racdb1等静态TNS别名为每个节点分配独立通道,并确保备份与归档路径为ASM或正确挂载的NFS共享存储。
rman在oracle rac中默认只走单节点,不是配置错了,而是没显式控制通道归属——所有allocate channel都落在随机连接的那个实例上,i/o和cpu立刻打满,加再多通道也没用。
为什么RMAN在RAC里始终只用一个节点备份
RMAN启动时若用connect target /或/ as sysdba,会按ORACLE_SID或本地监听路由到某个实例(比如racdb1),后续所有通道都在这个上下文中分配。哪怕你在racdb2机器上执行脚本,只要没显式切实例,v$session里就看不到其他节点有BACKUP类型会话。
- 典型报错:
ORA-12514: TNS listener does not currently know of service requested,本质是tnsnames.ora里写的不是指向具体实例的服务名(如racdb1、racdb2),而是SCAN服务名(如racdb) -
CONNECT 'sys/oracle@racdb_scan'是错误写法:SCAN地址会轮询分发,无法保证通道绑定到指定节点 - 必须用静态TNS别名,且每个别名明确指向单一实例(例如
racdb1只连node1的实例,racdb2只连node2的实例)
怎么写真正跨节点的ALLOCATE CHANNEL脚本
核心是每个通道前必须紧跟对应实例的CONNECT TARGET,且通道名全局唯一。以下双节点示例可直接复用:
RUN {
CONNECT TARGET sys/oracle@racdb1;
ALLOCATE CHANNEL c1 DEVICE TYPE DISK FORMAT '/backup/node1/%U';
CONNECT TARGET sys/oracle@racdb2;
ALLOCATE CHANNEL c2 DEVICE TYPE DISK FORMAT '/backup/node2/%U';
BACKUP DATABASE PLUS ARCHIVELOG;
RELEASE CHANNEL c1;
RELEASE CHANNEL c2;
}
-
FORMAT路径必须在两个节点都挂载、oracle用户可写;NFS需确认mount参数含hard,rsize=32768,wsize=32768,vers=3 - 不能在
BACKUP命令里加PARALLELISM——它只控制单实例内子通道,和跨节点无关 - 不要复用通道名:
RMAN-06002会直接报错;c1和c2必须不同 - 归档日志备份建议单独配通道(如
c3、c4),避免与数据文件通道争抢资源
共享存储路径和归档位置怎么设才不踩坑
路径“共享”不是指名字一样,而是所有节点能同时读写同一物理位置。本地路径(如/u01/backup)天然不共享,强行用会触发NFS lease timeout或静默失败(ORA-19504)。
- ASM最稳妥:
+RECO/rac/backup_%U,但要确认磁盘组在线、空间充足、所有实例有访问权限 - NFS必须在所有节点用相同
mount参数挂载,且chown oracle:oinstall、chmod 755;fstab里加noac或actimeo=0防缓存不一致 - 归档路径必须统一设为共享位置,例如:
ALTER SYSTEM SET log_archive_dest_1='location=+RECO/rac/arch' SCOPE=BOTH - 绝对不要把备份写进
db_recovery_file_dest(FRA)——它默认是本地路径,容易被归档占满,引发ORA-19566误报
最容易被忽略的是:CONFIGURE CHANNEL不是全局开关,它只对当前RMAN session生效,重启即失效;而且它是实例级设置——你在racdb1上配了FORMAT,对racdb2完全无效。真正在RAC里做多节点备份,ALLOCATE CHANNEL必须显式写进脚本,不能依赖配置继承。


















