RMAN备份元数据默认存于控制文件但易丢失,中等以上环境必须使用独立恢复目录(recovery catalog)存储,物理备份文件路径由BACKUP命令中FORMAT参数指定,如'/u01/backup/full_%U_%t',%U和%t为必需占位符。
备份集默认存放在控制文件里,但不建议长期依赖
rman 默认把备份元数据(比如备份时间、片名、scn号)写进目标数据库的 控制文件,物理备份文件(即 backupset)则按你指定的路径落地。问题在于:控制文件容量有限,且一旦目标库崩溃或控制文件损坏,这些元数据就丢了——你手上有备份文件,却不知道它对应哪次备份、能不能用。
Oracle 明确建议中等及以上规模环境使用独立的 恢复目录数据库(recovery catalog) 存储备份元数据。这不是可选项,是功能分水岭:没有 catalog,report obsolete、list backup by file、跨数据库恢复等关键命令直接不可用。
- catalog 数据库可以是轻量级的单独实例,甚至复用现有测试库,只要能连通目标库即可
- 必须用
create catalog初始化,再用register database把目标库注册进去 - 后续所有 RMAN 连接都要显式指定 catalog:
rman target / catalog rmanuser/password@catdb
物理备份文件路径由 FORMAT 参数决定,不是环境变量
很多人误以为改 $ORACLE_HOME 或 $ORACLE_BASE 就能控制备份文件落盘位置,其实完全无关。真正起作用的是 BACKUP 命令里的 FORMAT 字符串,例如:
backup database format '/u01/backup/full_%U_%t';
%U 是唯一标识符(8位随机+2位序列),%t 是时间戳(秒级 Unix 时间),这两个占位符必须保留,否则 RMAN 会报错 RMAN-06184: format string contains illegal character。
- 路径需提前创建好,RMAN 不会自动建目录;权限要确保 Oracle 用户可读写
- Windows 下路径要用双反斜杠或正斜杠,例如
D:\backup\full_%U或D:/backup/full_%U - 避免使用含空格或中文的路径,某些老版本 RMAN 会解析失败
- 若用磁带设备(sbt),FORMAT 要配合介质管理器配置,不能直接写本地路径
保留策略不是“自动删文件”,而是标记过期 + 手动清理
RMAN 的 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS 或 TO REDUNDANCY 2 只影响 REPORT OBSOLETE 和 DELETE OBSOLETE 的判断逻辑,不会定时触发删除。备份文件本身一直躺在磁盘上,直到你明确执行 DELETE OBSOLETE。
常见误解是设了 7 天保留就“自动清理”,结果磁盘爆满才发现一堆三年前的备份还在。
- 务必定期在维护窗口手动运行
delete obsolete;,最好封装进备份脚本末尾 - 执行前先用
report obsolete;预览将删哪些备份集,防止误删 - 如果用了 recovery catalog,
delete obsolete会同步更新 catalog 元数据;仅用控制文件时,控制文件里的记录也会被清除 - 注意:
delete obsolete不释放归档日志空间,归档日志需单独配置ARCHIVELOG DELETION POLICY
Windows 下脚本调用容易忽略环境变量隔离
在 Windows 上用批处理(如 rman.bat)调用 RMAN,常因 ORACLE_SID 或 ORACLE_HOME 设置不生效导致连接失败,错误信息通常是 RMAN-00571 或 ORA-12154。
根本原因是:批处理中 set ORACLE_SID=xxx 只对当前 CMD 进程有效,而 rman.exe 启动后可能读取系统级环境变量,或受注册表中 OracleService 实例影响。
- 务必在
rman.bat开头用setlocal,并在结尾用endlocal控制作用域 - 推荐显式指定连接串:
rman target sys/password@orcl,绕过 SID 解析环节 - 日志路径中的
%DATE%和%TIME%在空格处理上极不稳定,建议改用 PowerShell 脚本生成时间戳,或用date /t+time /t分步提取 - 任务计划程序里运行脚本时,默认工作目录不是脚本所在目录,
CMDFILE路径必须写绝对路径
restore 时 RMAN 无法识别其有效性。


















