recover table不支持schema级恢复,仅接受具体表名或分区名,因其底层基于物理数据文件还原与data pump导入,粒度锁定在segment级别;schema作为逻辑命名空间非存储实体,无法被rman识别。
recover table 不支持 schema 级恢复 —— 这是关键前提,必须先明确。
Oracle 12c 的 RECOVER TABLE 命令只接受具体表名(或分区名),不识别 SCHEMA、USER、OWNER 等逻辑容器概念。它底层走的是物理数据文件还原 + Data Pump 导出导入路径,对象粒度锁定在段(segment)级别,而非用户/模式维度。
为什么不能直接 recover schema?
- RMAN 恢复流程强制依赖辅助实例中可识别的、已注册的对象元数据;而 Schema 是逻辑命名空间,不是存储层实体
-
DBA_TABLES中的OWNER字段在辅助实例里可能因 CDB/PDB 上下文缺失或字典不一致导致查询失败 - 即使你用
SELECT table_name FROM dba_tables WHERE owner = 'MYSCHEMA'动态拼出表列表,RMAN 也不接受子查询或变量,只认硬编码的TABLE参数
替代方案:批量恢复指定 Schema 下所有表
需手动构造恢复命令序列,核心是两步闭环:
- 先在原库查出该 Schema 下所有可恢复的表(排除 SYSTEM/SYSAUX 表空间、临时表、IOT overflow 等)
- 再逐个执行
RECOVER TABLE,或封装为脚本循环调用
SELECT 'RECOVER TABLE ' || owner || '.' || table_name ||
' UNTIL TIME ''' || TO_CHAR(SYSDATE - 1/24, 'YYYY-MM-DD HH24:MI:SS') || ''''
FROM dba_tables
WHERE owner = 'MYSCHEMA'
AND tablespace_name NOT IN ('SYSTEM', 'SYSAUX')
AND temporary = 'N'
AND iot_type IS NULL;
生成的每条命令仍需单独提交给 RMAN,且注意:
- 所有表必须位于同一 PDB 中(不能跨 PDB 混合恢复)
- 若某张表依赖其他 Schema 的对象(如外键引用、同义词),恢复后需手动重建约束或权限
- 每次
RECOVER TABLE都会启动/销毁一次辅助实例,连续执行多张表时磁盘 I/O 和时间开销叠加明显
常见报错与绕过条件
-
ORA-65096: invalid common user or role name:说明 RMAN 未连接到CDB$ROOT,改用rman target /并确认SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL返回CDB$ROOT -
ORA-19921: no archive log found:目标时间点前后归档日志缺失,尤其注意 DROP 前 2~3 个归档序列必须完整,可用LIST ARCHIVELOG ALL核对 -
ORA-19554: error allocating device:通常因未配置AUXILIARY DESTINATION或路径无写权限,必须显式指定:RECOVER TABLE myuser.t1 ... AUXILIARY DESTINATION '/u01/aux'
真正容易被忽略的是:恢复后表的统计信息为空,索引虽随表一起导出但状态为 UNUSABLE,需要人工 ALTER INDEX ... REBUILD;另外,如果原表有基于函数的索引或虚拟列,Data Pump 导入阶段可能因字符集或 NLS 设置不一致失败。











