光配RETENTION POLICY不会节省空间,必须同步配置归档删除策略、执行CROSSCHECK和REPORT OBSOLETE,否则FRA很快爆满报ORA-19809。

直接说结论:光配 RETENTION POLICY 不会节省空间,必须同步配置归档删除策略、执行 CROSSCHECK 和 REPORT OBSOLETE,否则 FRA 很快爆满报 ORA-19809。
RECOVERY WINDOW OF N DAYS 不是“删掉 N 天前的备份”
很多人设了 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS,就以为 RMAN 会自动清理所有生成时间早于 7 天的备份片——这是错的。RMAN 实际判断依据是:SYSDATE - BACKUP CHECKPOINT TIME >= 7,而这个 CHECKPOINT TIME 是备份集中最老数据块的 SCN 时间,不是备份开始时间。比如一份全备是 10 天前做的,但它的 CHECKPOINT TIME 是 6 天前(因为数据块很新),它就不会被标为 OBSOLETE;反之,一份昨天做的增量备份,若包含大量旧块,CHECKPOINT TIME 可能是 8 天前,它反而会被标记。
这意味着:只要这份备份仍是支撑“恢复到过去 7 天内任意时刻”的必要环节,哪怕它生成于 12 天前,RMAN 就必须留着它。
- 误判常见于手动删过归档日志:一旦归档链断裂,RMAN 静默降级,那份 10 天前的全备立刻变
OBSOLETE,但不会报错 -
SHOW ALL只显示配置,不反映真实状态;真正要看哪些能删,必须跑REPORT OBSOLETE - 若用闪回恢复区(FRA),没配归档删除策略,归档日志会无限堆积,备份集再少也撑爆空间
必须显式配置 ARCHIVELOG DELETION POLICY
默认情况下,ARCHIVELOG DELETION POLICY 是 TO NONE,即归档日志永不自动删。哪怕你设了 7 天窗口,RMAN 也只管备份集是否过时,不管归档日志本身还“有没有用”。结果就是:备份可能按策略清理了,归档日志还在,FRA 空间持续上涨。
正确做法是根据备份目标介质配策略:
- 备份到磁盘:执行
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK - 备份到磁带:执行
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO SB_TAPE - 如果用了 Data Guard,还可配
APPLIED ON STANDBY,确保主库归档在备库应用后再删
补救已堆积的归档:可临时执行 CROSSCHECK ARCHIVELOG ALL; DELETE NOPROMPT EXPIRED ARCHIVELOG;,但这只是兜底手段,不能替代策略配置。
DELETE OBSOLETE 不等于自动清理
配置好策略后,RMAN 不会自动删任何文件。DELETE OBSOLETE 是一个手动命令,且它只删两件事都满足的备份:一是被当前策略判定为 OBSOLETE,二是物理上确实存在(路径可达、文件未被人工删过)。
所以标准操作流必须是:
- 先
CROSSCHECK BACKUP:同步控制文件记录与磁盘真实状态。若备份片已被删或 NFS 挂载异常,这步能发现并把对应记录标为EXPIRED - 再
REPORT OBSOLETE:列出所有“策略判定过期 + 物理存在”的备份。务必人工核对,尤其看最老全备是否仍在恢复链中 - 最后
DELETE OBSOLETE:真正执行删除。加NOPROMPT可跳过确认,但首次建议不加,防止误删
漏掉 CROSSCHECK,控制文件里还记着已丢失的备份,DELETE OBSOLETE 就会跳过它们,也不报错——你看着空间没释放,其实是因为 RMAN 根本没动那些“失踪”的条目。
别忽略 CONTROL_FILE_RECORD_KEEP_TIME
如果不用恢复目录(recovery catalog),RMAN 元数据全存在控制文件里,而 CONTROL_FILE_RECORD_KEEP_TIME 参数决定了这些记录最多保留多少天(默认 7 天)。一旦超期,旧备份元数据会被覆盖,REPORT OBSOLETE 就看不到它们,DELETE OBSOLETE 更无从谈起。
例如你设了 30 天恢复窗口,但 CONTROL_FILE_RECORD_KEEP_TIME 还是默认 7,那第 8 天起的备份元数据就可能被覆盖,RMAN 会“失忆”,导致该删的删不掉、不该删的误删。
- 查当前值:
SHOW PARAMETER control_file_record_keep_time - 若保留策略 > 7 天且不用恢复目录,建议调高,比如
ALTER SYSTEM SET control_file_record_keep_time=30 SCOPE=BOTH; - 注意:调太高会增大控制文件体积,尤其在高频备份环境下
真正卡住空间释放的,往往不是策略配错,而是归档策略缺位、CROSSCHECK 漏做、或控制文件元数据过期——这三处一出问题,DELETE OBSOLETE 就成了摆设。


















