RMAN备份在RAC中卡在控制文件读取阶段,根本原因是快照控制文件默认共用且位于本地或低效共享存储,造成实例间争用;应为每个实例单独配置ASM中的专属快照路径,并确保主控制文件也置于高性能ASM磁盘组。
为什么RMAN备份在RAC中卡在控制文件读取阶段
rman备份慢到离谱,尤其在backup database刚启动时长时间无进展,v$session_longops里看到大量control file sequential read等待,基本就是控制文件争用——rac里所有实例默认共用同一份控制文件,每次rman做快照(snapshot controlfile)都要加独占锁,其他实例的ckpt、lgwr、甚至普通sql都可能被阻塞。
根本原因不是磁盘慢,而是快照控制文件本身成了单点瓶颈:RMAN每次备份前必须生成一份一致性控制文件副本,而这个副本默认写在第一个实例的$ORACLE_HOME/dbs下(比如$ORACLE_HOME/dbs/snapcf_<code>ORCL1.f),其他节点要读它就得跨节点访问,走NFS或集群文件系统时延迟陡增。
- 检查当前快照位置:
SHOW SNAPSHOT CONTROLFILE NAME; - 确认是否落在共享存储但非ASM上(如OCFS2/NFS),这类路径在RAC中I/O放大严重
- 观察
v$system_event中control file sequential read平均等待时间是否>10ms - 对比单实例环境同样备份耗时——若单机快得多,基本锁定是RAC控制文件争用
把快照控制文件移到ASM并按实例隔离
快照控制文件不能放在本地文件系统,必须进ASM,且每个实例要有自己独立的快照路径,否则RMAN仍会抢同一份文件。ASM路径天然支持多实例并发读写,还能利用ASM striping分散I/O压力。
操作分两步:先为每个实例配置专属快照路径,再确保路径存在且权限正确。注意CONFIGURE SNAPSHOT CONTROLFILE NAME是实例级命令,必须连到对应实例执行。
- 实例1上执行:
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+DATA/ORCL/CONTROLFILE/snapcf_orcl1.f'; - 实例2上执行:
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+DATA/ORCL/CONTROLFILE/snapcf_orcl2.f'; - ASM中提前创建目录:
ASMCMD> mkdir +DATA/ORCL/CONTROLFILE - 不要用
ALTER SYSTEM SET改,RMAN不认;也不要用相对路径或未挂载的磁盘组
RMAN备份时仍慢?检查控制文件多重映像是否全在高速存储
即使快照路径改了,如果主控制文件本身还在慢盘上(比如老式SAN LUN或未开启条带的ASM磁盘组),RMAN每次备份前仍要从主控件读取数据构造快照,这一步无法绕过。此时v$controlfile显示的路径才是关键。
控制文件必须全部放在高性能ASM磁盘组(推荐EXTERNAL REDUNDANCY + 高速SSD盘组),且数量不少于3个——RAC要求至少2个,但3个能更好分摊读压力。别信“一个够用”,RMAN和CKPT进程会同时读不同副本。
- 查当前位置:
SELECT name, status FROM v$controlfile; - 迁移方法:先
SHUTDOWN IMMEDIATE,再用cp或ASMCMD cp复制到新ASM路径,最后STARTUP MOUNT后ALTER SYSTEM SET control_files=...并重启 - 避免混用:不要一部分控制文件在+DATA,一部分在+FRA——FRA通常性能更低,且RMAN默认不优先读它
- 确认ASM磁盘组
DISK_REPAIR_TIME没被调成720小时这种极端值,否则磁盘抖动时IO重试拖慢整体响应
验证是否生效:别只看RMAN输出时间
RMAN日志里Starting backup at和Finished backup at之间的时间差,掩盖了大量后台争用。真正要看的是控制文件相关等待是否消失,以及快照生成是否秒级完成。
最直接的验证方式是手动触发快照生成,然后立刻查等待事件。如果还卡,说明路径没生效或ASM权限不对;如果秒出,但备份整体仍慢,问题就转移到归档日志读取或备份目标存储上了。
- 手动生成快照:
RESYNC CATALOG;或BACKUP CURRENT CONTROLFILE;(后者更贴近真实场景) - 立即查:
SELECT event, time_waited_micro/1000000 sec FROM v$session_event WHERE event LIKE 'control%read' AND sid IN (SELECT sid FROM v$session WHERE program LIKE '%rman%') ORDER BY time_waited_micro DESC; - 如果
time_waited_micro接近0,说明快照环节已解耦;如果仍有几百毫秒以上,回去核对SHOW SNAPSHOT CONTROLFILE NAME输出是否真指向ASM且路径可写 - 注意:
v$backup_sync_io里control file类型的io_count应明显下降,这是最硬的指标
快照控制文件位置这事看着小,但RAC里它卡住的是整个备份流水线的起点。很多人改完以为好了,结果发现RMAN还是慢——八成是忘了在每个实例上单独执行CONFIGURE,或者ASM路径写错实例名,导致实际还是所有节点往同一个文件里挤。










