DELETE BACKUPSET BEFORE TIME 是最直接删除某时间点前备份集的RMAN命令,仅按COMPLETION_TIME筛选,不依赖保留策略,需用单引号包裹时间字符串并推荐TO_DATE显式转换,脚本中须加NOPROMPT,且不处理归档日志、镜像副本等。
DELETE BACKUPSET BEFORE TIME 是最直接的命令
想删掉某时间点前的所有备份集,delete backupset before time 是 rman 原生支持的方式,它不依赖保留策略,也不管文件是否“obsolete”,只按物理备份集的完成时间(completion_time)筛选。执行前必须确保时间格式合法,否则报错 ora-19554: error allocating device 或解析失败。
- 时间字符串必须用单引号包裹,且推荐用
TO_DATE显式转换,避免隐式转换出错:DELETE BACKUPSET BEFORE TIME 'TO_DATE(''2026-05-27'', ''YYYY-MM-DD'')' - 也可以用
SYSDATE - n算术表达式,但注意括号和引号嵌套:DELETE BACKUPSET BEFORE TIME 'SYSDATE-7'(引号内是字面量,不是 SQL 表达式) - 该命令只删备份集(backup sets),不碰归档日志、镜像副本(copy)、控制文件自动备份——这些要单独处理
- 默认会交互确认,脚本中必须加
NOPROMPT,否则卡住:DELETE NOPROMPT BACKUPSET BEFORE TIME 'SYSDATE-7'
归档日志得用 DELETE ARCHIVELOG UNTIL TIME 单独清理
DELETE BACKUPSET 对归档日志完全无效。归档日志有自己独立的生命周期管理,必须用 DELETE ARCHIVELOG UNTIL TIME 或 DELETE ARCHIVELOG FROM TIME。漏掉这步,FRA 空间很可能没释放——因为归档日志通常占空间大头。
- 删到某时间点为止(含):
DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'TO_DATE(''2026-05-27 23:59:59'', ''YYYY-MM-DD HH24:MI:SS'')' - 删某时间点之后的(慎用):
DELETE ARCHIVELOG FROM TIME 'SYSDATE-3'—— 这会删掉最近 3 天的新归档,可能破坏恢复链 - 如果同时要删物理归档文件并更新控制文件,加
DELETE INPUT:DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-7' DELETE INPUT - 执行前建议先
LIST ARCHIVELOG FROM TIME 'SYSDATE-7'看下范围,避免误删
CROSSCHECK + DELETE EXPIRED 是补救手动删文件后的必要步骤
如果你或运维同事曾用 rm 直接删过磁盘上的备份片(.bkp 文件),RMAN 资料库里记录还在,状态是 AVAILABLE 或 EXPIRED。此时 DELETE BACKUPSET BEFORE TIME 会跳过这些“已消失”的记录,导致 LIST BACKUP 仍显示大量条目,空间却没回收。
- 先运行
CROSSCHECK BACKUP,让 RMAN 扫描磁盘并把找不到的备份标记为EXPIRED - 再执行
DELETE EXPIRED BACKUP(或DELETE NOPROMPT EXPIRED BACKUP)清空元数据 - 同理处理归档日志:
CROSSCHECK ARCHIVELOG ALL→DELETE EXPIRED ARCHIVELOG ALL - 这一步不能省,尤其在 FRA 空间告警后手动清理过文件的环境
脚本里必须包含 LIST 验证和错误检查
批量删备份不是“发完命令就完事”。生产环境脚本若不验证结果,可能删错、漏删、或删了但没释放空间,等发现时已错过窗口。真实问题往往出在控制文件未刷新、FRA 视图延迟、或跨时区时间解析偏差上。
- 删完立即跑
LIST BACKUPSET COMPLETED BEFORE 'SYSDATE-7',确认返回为空 - 查空间释放情况:
SELECT * FROM V$RECOVERY_FILE_DEST;看PERCENT_SPACE_USED是否下降 - 捕获 RMAN 返回码:shell 脚本中用
$?判断 RMAN 进程是否成功退出,非零值需告警 - 别信“没报错=成功”——有些命令看似执行完,实则因权限不足、路径不可写、或备份集被锁定而静默跳过


















