RAC中不能直接用DELETE ARCHIVELOG ALL清理归档日志,因会引发节点间锁冲突导致文件跳过或ORA-19606错误;须先确认归档路径是否共享,再分节点用本地RMAN连接执行带时间范围、NOPROMPT和FORCE的删除命令。
不能直接在 rac 上用 delete archivelog all 清理归档日志——它会触发节点间锁冲突,导致部分文件静默跳过或报 ora-19606,实际空间没释放。
确认归档路径是否共享(关键第一步)
很多故障源于误以为“所有节点归档都写到同一位置”,结果只查一个节点就下结论。真实情况分两类:
- 若
log_archive_dest_1指向 ASM 磁盘组(如+FRA)或 NFS 路径(如/u01/arch),那就是共享归档,所有节点共用同一物理空间 - 若指向本地路径(如
/u01/arch/rac1、/u01/arch/rac2),则各节点独立写入,但 DBA 往往只清一个节点,另一个悄悄撑爆磁盘
执行以下命令验证:
SELECT INST_ID, NAME, VALUE FROM GV$PARAMETER WHERE NAME = 'log_archive_dest_1';
再逐节点检查空间:ASM 用 asmcmd lsdg,文件系统用 df -h。别信 archive log list 的输出,它只反映本节点归档开关状态,不反映共享目录真实使用率。
RMAN 连接必须用本地实例连接(绕过集群锁)
RAC 中 RMAN TARGET / 默认走 tnsnames.ora 别名,可能连到任意节点,RMAN 无法感知集群内其他实例正在操作同一份归档文件,从而引发锁竞争。
- 清理前先确保
ORACLE_SID设置为当前节点实例名(如rac1),再运行rman target / - 不要用
rman target sys/password@rac1这类远程连接方式,它绕不过实例级锁 - 如果脚本里写了多通道(
ALLOCATE CHANNEL c1 DEVICE TYPE DISK CONNECT 'sys/...@rac1'),反而增加跨节点风险,单节点清理更安全
删除命令必须带时间范围 + NOPROMPT + FORCE
用 ALL 是最常见踩坑点。RAC 下归档文件名含线程号(thread#),不同节点生成的归档混在同一个目录,但逻辑上属于不同实例。盲目删 ALL 可能误删其他节点尚未应用的归档。
- 优先用时间窗口:
DELETE NOPROMPT FORCE ARCHIVELOG UNTIL TIME 'SYSDATE-3'; - 若归档路径按节点隔离(如
/arch/rac1/、/arch/rac2/),可加LIKE限定:DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-1' LIKE '/arch/rac1/%'; - 避免
CROSSCHECK ARCHIVELOG ALL卡住:改用缩小范围的扫描,如CROSSCHECK ARCHIVELOG FROM TIME 'SYSDATE-5'; - 删除后务必跟
LIST ARCHIVELOG FROM TIME 'SYSDATE-3';验证,别只看 RMAN 输出的 “deleted X objects”
自动清理必须分节点部署 crontab(不能全局统一调度)
即使归档路径是共享的,crontab 也必须在每个节点单独配置,且脚本中显式指定 ORACLE_SID。否则可能出现:
- 某节点因环境变量未加载,
rman target /连错实例 - 两个节点同时执行相同时间窗口的清理,RMAN 内部锁机制失效,部分文件被跳过
- 脚本中漏掉
source ~/.bash_profile,导致ORACLE_HOME错误,RMAN 启动失败却无日志报错
推荐脚本头部固定写法:
#!/bin/bash export ORACLE_SID=rac1 # 手动设为当前节点名 export ORAENV_ASK=NO . oraenv rman target / <<EOF DELETE NOPROMPT FORCE ARCHIVELOG UNTIL TIME 'SYSDATE-3'; EXIT; EOF
真正容易被忽略的是:清理窗口(如 SYSDATE-3)必须比备份窗口(如 BACKED UP 2 TIMES TO DEVICE TYPE DISK)更宽——否则 RMAN 会跳过“已备份但未满足保留策略”的归档,空间还是清不掉。


















