oracle rman不会自动删除过期备份,必须显式执行delete obsolete;retention policy仅定义“哪些备份可删”,不触发清理动作;recovery window面向rpo推荐生产环境,redundancy按文件单独计数适合开发库;配完策略后须补crosscheck、report obsolete、确保归档完整三步才能安全清理。
oracle rman 不会自动删除过期备份文件,必须显式执行 delete obsolete;retention policy 只定义“哪些算过期”,不触发清理动作。
Retention Policy 的两种模式怎么选
Retention Policy 控制 RMAN 判断备份是否“obsolete”的依据,不是“多久删一次”,而是“哪些备份可以被删”。关键区别在策略类型:
-
RECOVERY WINDOW OF 7 DAYS:保留足以恢复到最近 7 天内任意时间点的最小备份集。注意——它可能保留远超 7 天的归档日志(只要这些日志对满足窗口必要) -
REDUNDANCY 2:每个数据文件/归档日志至少保留 2 份可恢复的备份。若某文件有 5 份备份,只保留最新的 2 份,其余标记为 obsolete
生产环境更推荐 RECOVERY WINDOW,它面向业务恢复目标(RPO),而 REDUNDANCY 容易因单次全备失败导致大量备份被误判为 obsolete。
为什么设置了 Policy 却没删文件
设置策略后,LIST OBSOLETE 能看到待删项,但备份文件物理上仍存在——RMAN 默认只“标记”,不“动手”。常见疏漏:
- 忘了在 RMAN 中运行
DELETE OBSOLETE(无参数时按当前 policy 判定并删除) - 加了
NOPROMPT才能免交互执行,否则脚本会卡住等待确认:DELETE NOPROMPT OBSOLETE - 使用了
CONFIGURE RETENTION POLICY TO NONE,这会让OBSOLETE判定失效(所有备份都不再被视作 obsolete) - 控制文件或恢复目录未同步:如果用恢复目录,必须连接目录库执行
DELETE OBSOLETE,否则只查控制文件快照
写一个安全可调度的清理脚本
直接在操作系统 shell 中调用 RMAN,避免手动登录。重点是:带验证、防误删、留痕。
#!/bin/bash export ORACLE_SID=orcl export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1 rman target / log=/u01/scripts/rman_delete_obs.log append <p>说明:</p>
-
LIST OBSOLETE SUMMARY输出简要统计(如几份 backupset、多少 archivelog),便于日志巡检 -
CROSSCHECK+DELETE EXPIRED清理控制文件中已不存在的备份记录(比如磁盘文件被手工删了但控制文件还不知道) - 务必用
log=... append记录每次执行结果,不能只依赖屏幕输出 - 首次运行前建议先用
REPORT OBSOLETE查看将删什么,确认无误再切到DELETE
真正容易被忽略的是:Retention Policy 的生效依赖于完整且一致的备份链。如果某次归档日志备份失败,或者控制文件自动备份被跳过,RECOVERY WINDOW 可能错误地保留大量旧备份——因为 RMAN 发现“缺中间环节,不敢删前面的”。所以清理脚本必须和备份成功率监控联动,不能孤立运行。











