crosscheck archivelog all 必须先执行,因为rman只信任控制文件记录,该命令强制校验磁盘实际存在性并将缺失文件标记为expired;否则delete expired仅清理元数据而非物理文件,且超期未被记录的归档需手工清理。

CROSSCHECK ARCHIVELOG ALL 为什么必须先执行
RMAN 不会主动扫描磁盘文件,它只信任控制文件里的记录。如果归档日志被手动移动、损坏或未同步更新,控制文件里仍标记为 AVAILABLE,但实际文件已不存在——这种“假存在”状态会导致后续删除失败或跳过真实文件。CROSSCHECK ARCHIVELOG ALL 就是强制 RMAN 去磁盘上挨个比对,把找不到的标记为 EXPIRED。不走这步,DELETE EXPIRED ARCHIVELOG ALL 就没东西可删,整个清理链就断在第一环。
DELETE EXPIRED ARCHIVELOG ALL 到底删了什么
它只删控制文件里的元数据记录,不碰磁盘文件。作用是释放 FRA(Fast Recovery Area)配额:RMAN 认为这部分空间“已不可用”,就会把它计入 PERCENT_SPACE_RECLAIMABLE。常见误区是以为它删了文件——其实只是清掉“僵尸指针”。如果 V$FLASH_RECOVERY_AREA_USAGE 里 PERCENT_SPACE_RECLAIMABLE 一直为 0,大概率就是这步没执行或执行后没生效。
DELETE ARCHIVELOG ALL COMPLETED BEFORE 的时间陷阱
-
COMPLETED BEFORE 'SYSDATE-7'看的是v$archived_log.completion_time,不是文件修改时间(mtime),更不是创建时间 - 别用
UNTIL TIME:它查FIRST_TIME(即日志起始 SCN 时间),在频繁切换场景下容易误删刚归档但尚未应用的文件 - 备库上执行前必须确认
APPLIED = 'YES',否则可能中断 DG 同步 - 命令里必须加
NOPROMPT,否则在脚本中会卡住等待交互确认
为什么 df -h 没变化?你可能漏了物理残留
RMAN 只能删它“看得见”的文件——而 control_file_record_keep_time 默认 7 天(查 SELECT value FROM v$parameter WHERE name = 'control_file_record_keep_time'),超期的归档元数据早被覆盖,RMAN 根本不显示它们。这些文件在 LIST ARCHIVELOG ALL 里查不到,DELETE 命令也无效。必须手工清理:
cd /path/to/archivelog find . -name "*.dbf" -mtime +15 -delete
前提是已确认这些文件不在任何备份集中、且远超恢复窗口(比如你只保留 14 天备份)。直接 rm 风险低,但建议先 find ... -print 预览路径和时间范围,避免误删。











