RMAN在RAC中必须显式跨节点分配通道,否则backup database仅在单实例执行,导致I/O和CPU瓶颈、节点故障无接管、归档日志遗漏;需为每个channel指定不同实例的TNS连接,snapshot controlfile须置于共享存储。

RMAN在RAC中必须跨节点分配通道,否则备份只跑在一个实例上,吞吐量卡死在单节点I/O和CPU瓶颈里。
为什么不能只连一个节点执行 backup database
在RAC中,backup database 命令本身不自动跨实例;即使数据文件物理上共享(如ASM),RMAN默认只通过当前连接的实例读取所有数据块。这会导致:
- 其他节点CPU/内存空闲,但I/O集中在单个节点的SGA和归档路径上
- 若该节点故障,备份中断且无自动接管机制
- 归档日志分散在各节点本地时,backup archivelog all 会漏掉未连接节点产生的归档
allocate channel 必须显式 connect 到不同实例
正确做法是为每个通道指定目标实例的TNS别名,确保RMAN会话真正分发到不同节点:
run {
allocate channel c1 type disk connect 'sys/password@rac1';
allocate channel c2 type disk connect 'sys/password@rac2';
backup database format '+BACKUP/%d_%T_%U.bak';
backup archivelog all format '+BACKUP/arch_%T_%s.bak' delete input;
release channel c1;
release channel c2;
}关键点:
-
connect后的TNS别名(如rac1)必须在每个节点的$ORACLE_HOME/network/admin/tnsnames.ora中正确定义,指向对应实例的VIP或SCAN监听 - 不要用
connect 'sys/password@rac-scan'—— SCAN负载均衡会让两个通道随机落到同一节点,失去并行意义 - 通道数不宜超过节点数;4节点RAC配4个通道即可,再多反而引发争用
归档日志位置决定 backup archivelog 的写法
归档是否集中存储,直接决定脚本结构:
- 若所有归档已存于共享ASM磁盘组(如
+ARCH),只需一个通道执行backup archivelog all即可覆盖全部 - 若归档分散在各节点本地(如
/u02/arch/rac1,/u02/arch/rac2),必须分别连接节点备份:backup archivelog from sequence XXX until sequence YYY thread 1(在rac1上)backup archivelog from sequence XXX until sequence YYY thread 2(在rac2上) - 使用
delete input时务必确认归档已被所有节点访问过——否则可能删掉其他节点还没读取的归档
snapshot controlfile 必须放在共享存储
RAC下控制文件快照(snapshot controlfile)默认在本地文件系统,会导致ORA-00245错误:
RMAN-03009: failure of backup command ... ORA-00245: control file backup failed; target is likely on a local file system
修复命令必须在RMAN中执行(所有节点生效):
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+DATA/<DBNAME>/CONTROLFILE/snapcf_<DBNAME>.f';
注意:
-
+DATA/<DBNAME>需替换为实际ASM磁盘组和DB_NAME(如+DATA/orcl) - 该配置只需运行一次,但必须在首次备份前完成
- 如果使用NFS挂载的共享目录,路径需为所有节点可写的绝对路径(如
/nfs/backup/snapcf.f)
最易被忽略的是归档日志的线程(thread)归属和快照控制文件位置——这两处出错不会立即报语法错误,而是在备份中途或恢复阶段才暴露,且排查成本极高。


















