RMAN在RAC中单节点备份主因是默认连接单一实例,需为每个节点显式CONNECT TARGET并ALLOCATE CHANNEL;归档与备份路径必须真正共享(ASM/NFS),且脚本须检查OPEN_MODE、归档切换及CROSSCHECK。
为什么RMAN在RAC里只用一个节点备份
根本不是rac不支持多节点并行,而是rman默认连接哪个实例,所有通道就跑在那个实例上。你用connect target /连到node1,哪怕脚本在node2上执行,allocate channel也只会落在node1——v$session里看不到其他节点有backup类型会话,吞吐卡死是必然的。
常见报错如ORA-12514: TNS listener does not currently know of service requested,往往是因为tnsnames.ora里写的不是指向具体实例的服务名(比如racdb1、racdb2),而是SCAN服务名(如racdb),导致多次CONNECT TARGET都路由到同一节点。
- 必须为每个要参与备份的节点,在
RUN块内显式执行CONNECT TARGET sys/password@service_name -
service_name必须是tnsnames.ora中分别定义、明确指向单个实例的条目,不能共用SCAN服务 - 每个
ALLOCATE CHANNEL必须紧跟在对应CONNECT TARGET之后,RMAN不会跨连接复用通道配置 - 通道名(如
c1、c2)在同一个RUN块里必须唯一,重复使用会触发RMAN-06002
共享存储路径怎么设才真正“共享”
归档日志和备份文件都得放在所有节点都能直接读写的路径上,否则通道分配再合理也没用。本地文件系统路径(如/u01/backup)天然不共享,NFS或ASM才是正解。
如果用NFS,必须在所有RAC节点上挂载同一远程路径,且权限一致:chown oracle:oinstall、chmod 755,fstab里加noac或actimeo=0避免缓存导致写入不一致;如果用ASM,路径形如+RECO/rac/backup_%U,要确认磁盘组在线、空间充足、且所有节点实例都有访问权限。
- 归档路径必须统一设为共享位置,例如
ALTER SYSTEM SET log_archive_dest_1='location=+RECO/rac/arch' SCOPE=BOTH - 备份
FORMAT中的%U最安全,避免文件名冲突;含空格或中文的路径会导致ORA-19504静默失败 - 不要把备份写到
db_recovery_file_dest(FRA)——它默认是本地路径,且容易被归档日志占满,引发ORA-19566误报 - 执行前用
ls -ld检查目标目录权限,用asmcmd ls +RECO或df -h验证空间
ALLOCATE CHANNEL和CONFIGURE CHANNEL到底该用哪个
CONFIGURE CHANNEL不是全局开关,它只对当前RMAN session生效,重启RMAN就失效;而且它是实例级设置——你在racdb1上配置了FORMAT,对racdb2完全没影响。真正在RAC里做多节点备份,ALLOCATE CHANNEL更可控、更明确。
ALLOCATE CHANNEL必须写在RUN块内,配合RELEASE CHANNEL(虽退出时自动释放,但显式释放能避免后续命令意外复用);而CONFIGURE CHANNEL适合单实例环境下的日常简化操作,但在RAC脚本里混用容易踩坑。
- 多节点备份脚本必须用
ALLOCATE CHANNEL,每个通道带CONNECT上下文 -
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT ...可以省略ALLOCATE,但仅限单实例,且配置后所有后续备份都走这个路径,灵活性差 - 若要用
MAXPIECESIZE限制单个备份片大小(比如防NFS写入超时),只能通过ALLOCATE CHANNEL指定,CONFIGURE不支持该参数 -
CONFIGURE CHANNEL设的参数一旦覆盖,之前配置全丢,比如先设MAXPIECESIZE 2G,再设FORMAT,前者就恢复默认值
备份脚本里最容易漏掉的三件事
很多人跑完RUN块看到completed successfully就以为万事大吉,其实元数据写进控制文件≠备份文件真正落盘。这三个检查点不做,恢复时大概率失败。
-
V$DATABASE.OPEN_MODE必须是READ WRITE(ARCHIVELOG模式)或MOUNT(NOARCHIVELOG),READ ONLY下BACKUP DATABASE直接报错 - 归档日志必须已全部切换并写入共享路径,执行
ALTER SYSTEM ARCHIVE LOG CURRENT后再备份,避免遗漏最后几组日志 - 执行
CROSSCHECK BACKUP和CROSSCHECK ARCHIVELOG ALL,再DELETE EXPIRED,否则控制文件里残留无效记录,后续RESYNC CATALOG可能失败
最常被忽略的是:恢复前必须关闭其他节点实例,只留一个启动状态;恢复完成后,再用srvctl start instance逐个拉起——这点在文档里藏得深,但跳过就会导致控制文件不一致或SMON无法清理事务。


















