rman默认不跳过只读表空间,必须显式配置backup optimization on并完成首次备份后,后续backup database才基于scn比对跳过未变更的只读数据文件。
可以实现,但不是“设为只读再备份”就自动省事——关键在 rman 的 backup optimization 配置和表空间状态的协同,否则只读表空间仍会被重复备份。
RMAN 备份时如何跳过只读表空间
Oracle 不会因为表空间是 READ ONLY 就默认跳过它;必须显式开启优化策略,RMAN 才会在后续全库备份中识别并跳过已备份过的只读数据文件。
-
CONFIGURE BACKUP OPTIMIZATION ON;是前提,缺了这句,BACKUP DATABASE仍会照常备份所有数据文件,包括只读的 - 该优化仅对
READ ONLY表空间生效,OFFLINE或RECOVERING状态不适用 - 首次备份后,RMAN 会记录每个数据文件的 SCN 和备份时间戳;后续执行
BACKUP DATABASE时,若发现某只读文件自上次备份以来未发生 SCN 变化(即确实没被写入),且已有有效备份,则标记为 “skipping” - 验证是否生效:执行
BACKUP DATABASE后查看输出日志,出现类似skipping datafile 5; already backed up 2 time(s)即表示跳过成功
为什么只读表空间能被跳过?底层机制是什么
因为只读表空间的数据文件头被冻结,SCN 固定,DBWn 在设为只读时已完成强制检查点,所有块都已刷盘。RMAN 利用这个确定性做一致性判断,而非依赖归档日志或增量变化跟踪。
- 不需要开启块变更跟踪(
V$BLOCK_CHANGE_TRACKING.STATUS),BACKUP OPTIMIZATION对只读表空间完全独立工作 - 控制文件中记录了每个只读数据文件的
checkpoint_change#,RMAN 每次备份前比对这个值是否与上次备份一致 - 如果手动修改过数据文件(比如用 dd 覆盖头部),即使表空间仍是
READ ONLY,RMAN 也可能因校验失败而拒绝跳过,甚至报ORA-19602
容易踩的坑:配置开了但没跳过,常见原因
不是配了 BACKUP OPTIMIZATION ON 就一劳永逸,以下情况会导致跳过失效:
- 执行
BACKUP DATABASE前没做过该表空间的**任何一次备份**——优化策略只对“已存在有效备份”的只读文件起作用 - 只读表空间曾被临时切回
READ WRITE,哪怕只执行了一条INSERT再回切,其数据文件 SCN 已变,RMAN 会视为新文件重新备份 - 使用了
BACKUP AS COPY(镜像拷贝)而非备份集(backupset):优化策略对镜像拷贝无效,只作用于BACKUP DATABASE类备份集 - 控制文件损坏或未启用自动备份(
CONTROLFILE AUTOBACKUP关闭),导致 RMAN 无法准确读取只读文件的冻结 SCN 信息
备份策略落地建议:冷热混合 + 显式归档隔离
真正稳定的只读表空间备份策略,得把 RMAN 配置、表空间生命周期和归档管理串起来。
- 对长期静态的历史归档表空间,先
ALTER TABLESPACE tbs_archive READ ONLY,再立刻执行一次BACKUP TABLESPACE tbs_archive—— 这是触发后续跳过的“种子备份” - 确保
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 30 DAYS,避免只读备份因策略过严被误删,导致下次全备又重来 - 归档日志不要和只读表空间混放同一磁盘路径;RMAN 备份归档时若路径冲突,可能干扰只读文件的元数据识别
- 每季度用
LIST BACKUP OF TABLESPACE tbs_archive核查备份链完整性,别只信日志里的 “skipping” 字样
最易被忽略的是:只读表空间的备份优化只在 RMAN 层生效,expdp 导出、闪回查询、甚至某些第三方备份工具仍可能全量拉取——策略闭环必须覆盖整个数据生命周期,不能只盯 RMAN 配置那一行命令。











