rman默认不恢复只读表空间,因为其数据文件头scn被冻结且控制文件标记为readonly状态,recover命令仅处理online或offline数据文件,会跳过或报错ora-01153;必须先执行alter tablespace ... read write解冻文件头,再进行标准restore+recover流程。

只读表空间不能直接用 RECOVER TABLESPACE 命令在线恢复——RMAN 会跳过它,或报错 ORA-01153(激活的不兼容介质恢复)。必须先切为读写状态,再走标准 restore + recover 流程,否则数据文件头部冻结的 SCN 与控制文件不一致,open 时必然触发 ORA-01113。
为什么 RMAN 默认不恢复只读表空间
表空间设为 READ ONLY 后,数据文件头被冻结,SCN 不再推进,控制文件中标记为 READONLY 状态。RMAN 在 restore 阶段会检查该标记,若发现目标表空间是只读的,且备份也是只读时,RESTORE TABLESPACE 可能成功,但 RECOVER TABLESPACE 会拒绝应用归档日志(因为“没变更就不该恢复”)。更常见的是:RMAN 直接跳过该表空间,不报错也不提示。
- 现象:执行
restore tablespace tbs_name后,list backup of tablespace tbs_name显示有备份,但recover tablespace tbs_name返回 “no backup or copy of datafile found to restore” - 根本原因:RMAN 元数据中该表空间的
STATUS是READONLY,而RECOVER命令默认只处理ONLINE或OFFLINE的数据文件 - 绕过方式不是加参数,而是改状态——这是唯一可靠路径
恢复前必须先 offline 并转为 read write
不能跳过这步直接 recover。即使你用 set newname 指定了新路径,只要表空间还是只读,RMAN 就不会把归档日志应用到其数据文件上。
- 在目标库(非辅助实例)中执行:
ALTER TABLESPACE tbs_name OFFLINE IMMEDIATE; - 再执行:
ALTER TABLESPACE tbs_name READ WRITE;(这会解冻文件头,允许 SCN 推进) - 确认状态:
SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name = 'TBS_NAME';—— 必须看到ONLINE或至少OFFLINE,不能是READONLY - 注意:如果原表空间已被 drop,此步在目标库无意义;此时恢复必须走异地还原路径,见下一条
异地还原只读表空间(RAC/PDB 场景强制要求)
RAC 或多租户环境下,RECOVER TABLESPACE 无法在原集群执行——辅助实例启动失败是确定性结果。必须用原备份在独立主机还原出只读副本,再导出数据。
- 新主机 Oracle 版本、补丁集必须与原库严格一致(如
12.1.0.2.0,差一个数字都可能 restore controlfile 失败) - 第一步必须执行:
set dbid xxx(DBID 来自原库v$database.dbid),否则restore controlfile报 ORA-19566 - 控制文件必须从 RMAN 备份恢复,
backup controlfile to trace生成的 SQL 不可用——缺归档序列链 - 恢复命令用:
restore tablespace tbs_name; recover database until time 'yyyy-mm-dd hh24:mi:ss';,禁用skip forever tablespace - 归档路径必须匹配:
log_archive_dest_1指向的目录要存在,且归档文件名格式(如%t_%s_%r.dbf)必须与原库完全一致
恢复后数据回迁的关键细节
异地还原出的库只能作为只读数据源,不能直接加入原集群。回迁时最容易漏掉三件事:
- 目标表空间必须提前重建:
CREATE TABLESPACE tbs_name DATAFILE ...,否则impdp remap_tablespace会失败 - 用户默认表空间和配额必须手动设置好,
expdp/impdp不自动迁移这些属性 - 如果原表空间含加密列或 TDE 表空间,必须同步 wallet 文件并
ADMINISTER KEY MANAGEMENT SET KEY,否则 impdp 解密失败
真正卡住的往往不是命令语法,而是归档路径格式不一致或 DBID 没设——这两个点查不到错误日志里,只会 silent fail 或卡在 recover 阶段不动。











