skip readonly是跳过只读表空间的最简可靠方式,状态驱动、无需硬编码表空间名,且必须写在backup命令末尾、不能拼错;它对backup database和tablespace有效,但验证时也需同步使用skip readonly,否则会误报错误。

直接用 SKIP READONLY 参数,RMAN 就会跳过所有只读表空间的数据文件,无需手动列名。 这是最简单、最可靠的方式,比 SKIP TABLESPACE 或 EXCLUDE TABLESPACE 更适合归档类只读场景。
为什么不用 SKIP TABLESPACE 或 EXCLUDE TABLESPACE?
这两个命令需要你显式写出表空间名,比如 SKIP TABLESPACE(EXAMPLE, USERS)。但只读表空间往往是动态归档产生的(如每月一个 HIST_202501),硬编码名字会让脚本失效或漏跳。而 SKIP READONLY 是状态驱动的——只要控制文件里标记为 READ ONLY,RMAN 自动跳过,不管名字是什么。
另外注意:EXCLUDE TABLESPACE 从 Oracle 12c 才支持,SKIP TABLESPACE 虽然兼容老版本,但它跳的是“逻辑排除”,不感知只读状态;如果某个表空间被设为只读但没被列在 SKIP TABLESPACE 列表里,它仍会被备份。
SKIP READONLY 的正确写法和常见错误
必须写在 BACKUP 命令行末尾,且不能加引号、不能拼错(比如写成 SKIP READNOLY 或 SKIP READ ONLY):
RMAN> BACKUP DATABASE SKIP READONLY FORMAT '/backup/%d_%U.bak';
-
SKIP READONLY只对BACKUP DATABASE和BACKUP TABLESPACE有效,对BACKUP ARCHIVELOG无效 - 不能和
PLUS ARCHIVELOG写在同一命令里再加SKIP READONLY—— 归档日志部分不受影响,但数据库部分会跳只读,语法上合法,但容易误以为归档也被跳了 - 如果同时用了
CONFIGURE BACKUP OPTIMIZATION ON,SKIP READONLY仍优先执行:即先跳只读文件,再对剩余可写文件做优化判断
备份验证时也得带 SKIP READONLY
用 RESTORE VALIDATE 测试备份可用性时,如果不加 SKIP READONLY,RMAN 会尝试校验那些已被跳过的只读文件,结果报 ORA-01157 或卡住——不是备份坏了,而是验证命令没对齐。
正确写法:
RMAN> RESTORE DATABASE VALIDATE SKIP READONLY;
这点特别容易被忽略:备份时跳了,验证时忘了跳,就会误判备份失败。
真正要注意的是控制文件中只读状态的准确性——如果表空间被设为只读后又意外改回读写但没同步到控制文件,或者用了 ALTER TABLESPACE ... READ ONLY IMMEDIATE 但未 checkpoint,RMAN 可能无法识别最新状态。建议备份前查一次 SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE STATUS = 'READ ONLY' 确认。











