RAC环境中RMAN备份必须全部使用ASM路径:CONTROLFILE AUTOBACKUP、SNAPSHOT CONTROLFILE、备份FORMAT及归档目标均需显式配置ASM路径,且全节点统一;RETENTION POLICY全局生效,但CROSSCHECK/DELETE OBSOLETE须在备份片所在节点执行。

CONTROLFILE AUTOBACKUP 必须显式指向ASM路径
RMAN默认的 CONTROLFILE AUTOBACKUP FORMAT 值是 '%F',它不带路径,实际会落进 $ORACLE_HOME/dbs —— 这是单节点本地路径,在RAC中另一节点根本看不到。一旦控制文件变更(比如加数据文件),没备份就等于恢复起点丢失。
必须手动配置成ASM路径:
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON; RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '+DATA/BACKUP/control_%F';
验证方式:执行 ALTER SYSTEM ARCHIVE LOG CURRENT 后,用 asmcmd ls +DATA/BACKUP/ 确认生成了新文件。别依赖 show all 输出里“已启用”就以为完事——路径错,等于没开。
SNAPSHOT CONTROLFILE NAME 不能只配路径,还得触发创建
即使 SHOW SNAPSHOT CONTROLFILE NAME 显示已设为 '+DATA/snapcf_xfdb.f',ASM里也可能没有真实文件。ORA-00245 报错本质是RMAN试图读取快照控制文件时,发现目标路径下为空或不可访问。
解决分两步:
- 先清空再重配:
CONFIGURE SNAPSHOT CONTROLFILE NAME CLEAR;→CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+DATA/snapcf_xfdb.f'; - 立即执行一次备份(哪怕只备一个归档):
BACKUP ARCHIVELOG ALL DELETE INPUT;—— 这步会强制在ASM中生成物理快照文件
后续所有RMAN操作(包括catalog同步)才真正用上ASM里的快照,而不是退回到某个节点的本地临时文件。
备份脚本里 FORMAT 必须写死ASM路径,别信环境变量
常见错误是脚本里写 FORMAT '/rmanbak/%U',然后靠 export RMAN_BAK_PATH=/rmanbak 动态拼接。问题在于:这个路径若没挂载在所有节点、或挂载点不一致(如 node1 挂 nas1:/backup,node2 挂 nas2:/backup),备份就变成“伪共享”,restore时直接报找不到piece。
正确做法是全部硬编码ASM路径:
backup database format '+DATA/BACKUP/db_%d_%T_%U'; backup archivelog all format '+DATA/BACKUP/arch_%t_%s_%c' delete input;
ASM天然共享,无需挂载协调;所有节点执行同一脚本,结果一致可互认。别省那几行字符去拼路径——RAC里“看起来一样”不等于“逻辑等价”。
归档日志目标也得统一落在ASM,否则备份链断裂
RMAN BACKUP ARCHIVELOG ALL 只扫 LOG_ARCHIVE_DEST_n 配置的有效目标。如果只在节点1配了 LOG_ARCHIVE_DEST_1='LOCATION=+ARCH',节点2没配或配成本地目录,那节点2产生的归档就不会被备份到,restore时必然缺日志。
必须全集群统一配置:
- 所有节点执行:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=+ARCH' SCOPE=BOTH; - 禁用本地归档目标(如
/u01/arch),避免意外写入 - 检查
V$ARCHIVED_LOG的NAME列,确认全是+ARCH/...开头
归档分散 = 备份残缺 = 恢复失败。这不是概率问题,是确定性故障。
最易被忽略的一点:CONFIGURE RETENTION POLICY 在RAC中生效范围是全局,但 CROSSCHECK 和 DELETE OBSOLETE 必须在有备份片物理存在的节点上运行。如果只在节点1做删除,节点2的ASM diskgroup里可能还躺着过期备份——不是bug,是设计如此。清理动作最好固定在一个节点执行,或用脚本确保每次都在同一节点触发。


















