rac中rman因归档不一致直接失败,根本原因是各节点log_archive_dest_1未统一指向集群共享存储(如asm/nfs),导致rman默认只扫描当前连接实例的本地归档路径,静默遗漏其他节点归档;恢复时因序列号不连续而报ora-00329或ora-00310。

为什么RAC中RMAN会因归档不一致直接失败
RMAN在RAC中默认只扫描当前连接实例的归档路径,如果各节点LOG_ARCHIVE_DEST_1指向本地目录(如/u01/arch),那么RMAN备份时只会看到本节点产生的归档日志,其他节点的归档物理存在但被完全忽略——这不是报错,而是静默遗漏。恢复时一旦需要跨节点序列号的日志(比如节点1有1_100、节点2有1_101),RMAN就报ORA-00329或ORA-00310,提示“归档不连续”。
- 典型现象:RMAN
BACKUP ARCHIVELOG ALL后,LIST BACKUP OF ARCHIVELOG显示的序列号跳号、断层 - 根本原因不是网络或权限,而是归档路径未统一指向集群共享存储(ASM/NFS)
- 哪怕所有节点都启用了
ARCHIVELOG模式,路径分散就等于RMAN眼里只有“半库”
如何确认归档路径是否真正共享
别只看参数值,要验证所有节点是否实际写入同一位置且可互访。先查参数:
SQL> SHOW PARAMETER log_archive_dest_1
若返回类似LOCATION=/u01/arch,基本已踩坑;正确应为LOCATION=+FRA或LOCATION=/shared_nfs/arch。再验证物理层面:
- 在每个节点执行:
ls -l +FRA/DBNAME/archivelog/(ASM)或ls -l /shared_nfs/arch(NFS),确认目录存在、属主为oracle:oinstall、权限为750 - 用
asmcmd lsdg确认+FRA磁盘组在所有节点都MOUNTED且USABLE_FILE_MB > 0 - 从节点1执行
touch /shared_nfs/arch/test_node1,再到节点2执行ls /shared_nfs/arch/test_node1,必须可见
RMAN备份归档前必须显式分配维护通道
RAC中RMAN默认通道只连当前实例,BACKUP ARCHIVELOG ALL命令本身不会跨节点扫描。不手动干预,备份永远不全。
- 进入RMAN后第一件事:
ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK; - 再执行:
BACKUP ARCHIVELOG ALL DELETE INPUT;(DELETE INPUT才触发清理逻辑) - 禁用时间条件:
BACKUP ARCHIVELOG FROM TIME 'SYSDATE-1'在RAC中危险——节点间时间差哪怕2秒就会漏归档 - 若用catalog,执行
LIST DB_UNIQUE_NAME OF DATABASE确认所有实例已注册,否则备份元数据不同步
归档删除策略配错会加剧不一致
Oracle 11g/12c RAC中,APPLIED ON ALL STANDBY策略在ADG场景下极易误判——备库处于READ ONLY WITH APPLY状态时,RMAN可能认为归档“已应用”而提前删除,导致主库某节点归档被删、另一节点还没传完。
- 必须设为:
CONFIGURE ARCHIVELOG DELETION POLICY TO SHIPPED TO ALL STANDBY; - 验证:
SHOW ARCHIVELOG DELETION POLICY;输出必须是SHIPPED TO ALL STANDBY - 若备库已下线但
v$archive_dest里仍有STATUS != INACTIVE的条目,立即执行:ALTER SYSTEM SET log_archive_dest_2='' SCOPE=BOTH SID='*'; - 避免用
FORCE硬删:DELETE NOPROMPT FORCE ARCHIVELOG能解燃眉之急,但掩盖了DG配置残留问题,后续仍会复发
最易被忽略的是:归档路径统一后,LOG_ARCHIVE_DEST_STATE_n在所有节点都必须为ENABLE。哪怕只有一个节点设成DEFER,RMAN的SHIPPED TO ALL STANDBY策略就会失效,因为它仍认为该目标“理论上需要归档”,从而阻止删除——这种隐性依赖不会报错,只会让闪回区悄悄涨满。











