不能。keep forever 仅跳过 delete obsolete 检查,不防手动删除、存储故障、控制文件记录覆盖或 fra 自动清理;需配合 control_file_record_keep_time 设置、独立非 fra 路径、显式注册与人工维护。

开了 KEEP FOREVER 就真能永久存着?不能。它只是绕过保留策略,不等于文件不会被删、不会失效、不需要维护。
KEEP FOREVER 不是“永不删除”,而是“跳过 DELETE OBSOLETE 检查”
Oracle 的 DELETE OBSOLETE 命令只清理被当前保留策略(如 RECOVERY WINDOW OF 7 DAYS 或 REDUNDANCY 2)标记为过时的备份。加了 KEEP FOREVER 的备份会被 RMAN 显式排除在该逻辑之外——但它依然可能因以下原因消失:
- 手动执行
DELETE FORCE(带FORCE会无视KEEP属性) - 所在磁盘被清空、目录被误删、NFS 共享断连且未挂载
- 备份集对应的控制文件记录被覆盖(
CONTROL_FILE_RECORD_KEEP_TIME默认 7 天,若超过此时间又没做CATALOG,RMAN 就“忘记”这个备份存在) - 使用 FRA 存储时,FRA 空间满触发自动清理(FRA 的清理逻辑独立于 RMAN 保留策略,
KEEP FOREVER对其无效)
正确使用 KEEP FOREVER 的三步实操
必须显式执行,不能靠配置项默认生效:
- 备份时直接加
KEEP FOREVER:BACKUP DATABASE KEEP FOREVER FORMAT '/backup/annual_full_%U'; - 对已有备份打标:
CHANGE BACKUPSET 123 KEEP FOREVER;(其中123是LIST BACKUP查到的BS_KEY) - 强制注册进 RMAN 库(尤其当控制文件重建过或从异地拷贝来):
CATALOG START WITH '/backup/annual_full_';
注意:KEEP FOREVER 只作用于备份集(BACKUPSET)或镜像拷贝(COPY),不支持单独对归档日志加该属性;如需长期保留归档,得用 ARCHIVELOG DELETION POLICY 配合。
容易被忽略的两个硬性依赖
缺一不可,否则 KEEP FOREVER 形同虚设:
-
CONTROL_FILE_RECORD_KEEP_TIME必须 ≥ 你计划保留的最长时间。例如要存 3 年,就得先执行:ALTER SYSTEM SET CONTROL_FILE_RECORD_KEEP_TIME=1095 SCOPE=BOTH;否则控制文件里对应记录早被覆盖,RESTORE时 RMAN 根本找不到元数据。 - 所有
KEEP FOREVER备份必须存储在**可控、可监控、非 FRA 的独立路径**。FRA 下的KEEP FOREVER文件仍可能被 FRA 自动清理机制干掉——这是 Oracle 明确文档行为,不是 bug。
真正长期可用的备份,靠的不是加一个关键字,而是路径可控 + 控制文件记录周期匹配 + 元数据显式注册 + 存储层人工巡检。RMAN 不会替你记住哪份该留十年。











