RMAN在Oracle 19c RAC中并行备份到ASM需显式为各通道指定CONNECT实例、确保所有节点挂载目标ASM磁盘组、统一归档路径至ASM且归档链完整,否则默认单节点执行。

在 Oracle 19c RAC 中用 RMAN 并行备份到 ASM,关键不是“能不能”,而是“通道是否真正跨节点、ASM 路径是否被所有实例识别、归档日志链是否完整”。默认配置下,BACKUP DATABASE PLUS ARCHIVELOG 很可能只在一个节点上跑完全部备份,白白浪费 RAC 的并行能力。
为什么 RMAN 备份没真正跨节点执行
RMAN 通道本质是数据库会话,而会话默认绑定在连接的实例上。即使你在 node1 上运行 RMAN 连接 target /,所有 ALLOCATE CHANNEL 默认都在 node1 启动 —— 即使 ASM 磁盘组(如 +DATA)本身是共享的,备份 I/O 仍集中在单节点,CPU/IO 成为瓶颈。
- 检查当前通道归属:RMAN 中执行
SHOW ALL,看CONFIGURE CHANNEL是否含CONNECT子句;若没有,说明通道未显式指定连接目标实例 - 确认实际运行节点:备份过程中查
V$SESSION,过滤PROGRAM LIKE '%rman%',看INST_ID是否只出现一个值 - 19c 默认不启用跨节点并行 —— 这和 11.2 以前靠 TNS load_balance=NO 的老办法不同,现在靠的是
CONNECT+ 实例名显式控制
如何让 RMAN 通道真正分发到多个 RAC 实例
必须为每个通道显式指定连接哪个实例,且该实例必须能访问目标 ASM 磁盘组(通常没问题,但需验证)。
- 先确保所有节点都能访问目标 ASM 磁盘组:在 node1 和 node2 分别执行
sqlplus / as sysasm→SELECT NAME, STATE FROM V$ASM_DISKGROUP WHERE NAME = 'DATA';,状态必须是MOUNTED - 在 RMAN 中分配多通道并指定实例连接:
RMAN> RUN { ALLOCATE CHANNEL c1 DEVICE TYPE DISK CONNECT 'sys/oracle@racdb1' FORMAT '+DATA/backup/%U'; ALLOCATE CHANNEL c2 DEVICE TYPE DISK CONNECT 'sys/oracle@racdb2' FORMAT '+DATA/backup/%U'; BACKUP DATABASE PLUS ARCHIVELOG; RELEASE CHANNEL c1; RELEASE CHANNEL c2; } -
racdb1和racdb2是 TNSNAMES.ORA 中定义的服务名,分别指向 node1 和 node2 的实例;密码必须正确,且用户需有SYSDBA或SYSBACKUP权限 - 不要混用
CONFIGURE CHANNEL和ALLOCATE CHANNEL:前者是全局配置,后者是 RUN 块内动态分配;跨节点必须用后者显式CONNECT
备份路径写入 ASM 时的常见陷阱
写入 ASM 不是把路径换成 +DATA 就完事 —— ASM 需要目录结构、权限隔离、以及 RMAN 对格式字符串的实际解析规则。
-
FORMAT '+DATA/backup/%U'中的backup是 ASM 别名(alias),不是操作系统目录;首次使用前需手动创建:ASMCMD> mkalias +DATA/backup(注意:不能用斜杠嵌套多级,ASM 不支持传统目录树) - 如果报错
ORA-19504: failed to create file '+DATA/backup/xxx.bkp',大概率是 alias 不存在,或当前连接实例无权在该磁盘组创建 alias(检查V$ASM_CLIENT确认实例已注册) - 不要用
%d_%T_%s_%p这类变量拼接长文件名:ASM 对 alias 长度限制严格(最长 255 字符),过长会导致创建失败;建议精简为%U或%d_%T_%s - 归档日志备份也必须走同一 ASM 路径:PLUS ARCHIVELOG 会复用通道的 FORMAT,所以只要通道 FORMAT 指向 ASM,归档日志也会写进去 —— 无需额外配置
归档日志链断裂导致备份卡在“当前日志已存档”
这是最隐蔽的问题:备份看起来在运行,但长时间停在 当前日志已存档,最后静默失败或只完成部分归档备份。根本原因是某个节点的归档日志没传到共享位置,或 FRA 空间满导致归档中断。
- 查所有节点归档状态:
ARCHIVE LOG LIST在 node1 和 node2 分别执行,确认都是Archive Mode且Automatic archival: Enabled - 查归档目标是否统一指向 ASM:
SHOW PARAMETER log_archive_dest_1,理想值应为LOCATION='+RECO'(不是USE_DB_RECOVERY_FILE_DEST);若混用 FRA 和 ASM,RMAN 可能找不到某些归档 - 查归档日志物理存在性:
SELECT THREAD#, SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG WHERE DEST_ID = 1 AND STANDBY_DEST = 'NO' ORDER BY 1,2 DESC;,确认各 thread 的最新 sequence 在所有节点一致 - 备份前强制切换并验证:
ALTER SYSTEM ARCHIVE LOG CURRENT;×2,再查V$ARCHIVED_LOG确保新日志已生成并可访问
真正难的不是命令怎么写,而是确认每个节点的归档路径、ASM 挂载状态、TNS 连接可用性这三件事是否同时成立 —— 缺一不可。任何一项不满足,RMAN 就会退化成单节点串行执行,还可能不报错。


















