会。RMAN全备默认备份在线的只读表空间以保证还原一致性,但会导致备份冗余;需显式使用BACKUP DATABASE SKIP READONLY才跳过,且须在主命令层级指定,还原时依赖控制文件中表空间状态信息。
Oracle 全备时 rman 默认会备份只读表空间吗?
会。即使表空间是 read only,只要它在数据库中处于在线状态(online),rman 默认就会把它纳入全量备份(backup database)范围——哪怕数据块从创建后就再没变过。
这是 RMAN 的一致性设计逻辑:保证备份集能完整还原出当前数据库结构。但代价是,备份体积虚高、耗时拉长,尤其当只读表空间占几百GB(比如历史归档库、数据仓库的分区表空间)时,纯属浪费。
- 验证方式:
SELECT tablespace_name, status FROM dba_tablespaces WHERE status = 'READ ONLY'; - RMAN 不会主动跳过,除非你显式告诉它“别管这些”
-
SKIP READONLY不是开关,而是BACKUP命令的一个可选参数,必须写进命令里才生效
BACKUP DATABASE SKIP READONLY 怎么写才真正生效?
关键不是加了参数就行,而是要确保它出现在正确的命令层级、且没有被更高优先级的配置覆盖。
- 必须写在
BACKUP DATABASE主命令后面,不能放在CONFIGURE里(RMAN 没有全局SKIP READONLY配置项) - 正确写法:
BACKUP DATABASE SKIP READONLY PLUS ARCHIVELOG; - 错误写法:
CONFIGURE BACKUP OPTIMIZATION ON;—— 这个和只读表空间无关,它只影响重复文件的备份决策 - 如果用了
BACKUP DATABASE INCLUDE CURRENT CONTROLFILE,SKIP READONLY仍需显式追加,不自动继承
跳过只读表空间后,还原恢复还能用吗?
能,但有条件。跳过只读表空间备份 ≠ 放弃一致性保障,RMAN 会自动处理依赖关系。
- 还原时,RMAN 会检查控制文件中该表空间的状态:如果是
READ ONLY,则跳过数据文件还原,直接ALTER TABLESPACE ... READ ONLY - 前提是:控制文件本身必须被备份(推荐用
INCLUDE CURRENT CONTROLFILE或BACKUP CURRENT CONTROLFILE) - 如果只读表空间后来被改成
READ WRITE,下一次全备必须去掉SKIP READONLY,否则会导致该表空间丢失变更 - 注意:
SKIP READONLY对RESTORE DATABASE无影响,但对RECOVER DATABASE有隐含要求——归档日志必须覆盖到只读表空间变为只读的时间点之后
为什么有时候加了 SKIP READONLY 还是报错或没跳过?
常见原因不是语法错,而是状态或权限没对齐。
- 表空间状态不是
READ ONLY:比如是READ WRITE但误以为只读;或者状态是OFFLINE(RMAN 默认跳过离线表空间,跟SKIP READONLY无关) - 用户连接的是 PDB,但没在对应 PDB 下执行命令:在 CDB$ROOT 中执行
BACKUP DATABASE默认只备份 CDB,不会包含 PDB 的只读表空间;需先ALTER SESSION SET CONTAINER = pdb_name; - RMAN 连接目标库用的是
SYSDBA,但没带AS SYSBACKUP权限(12c+ 推荐):某些版本下权限不足会导致参数被忽略 - 使用了
SECTION SIZE并行备份:这个参数与SKIP READONLY兼容,但若某 section 恰好跨只读/读写混合文件,可能触发意外行为,建议先禁用测试
最稳的做法:先查清只读表空间列表,再手动执行一条最小化命令验证,比如 BACKUP TABLESPACE users SKIP READONLY; —— 而不是一上来就跑全库。










