RECOVER TABLE 恢复需连 CDB$ROOT、显式指定 UNTIL SCN、设置可写 AUXILIARY DESTINATION,且仅恢复数据行,不重建索引/约束;前提不满足时易静默失败或报错。

RECOVER TABLE 能恢复单个表或分区,但不是“点一下就还原”,它本质是自动拉起一个临时库(auxiliary instance),导出再导入。不满足前提条件时命令会静默失败或报错,而不是明确提示缺什么。
必须连 CDB$ROOT 才能执行 RECOVER TABLE
哪怕你要恢复的是某个 PDB 里的表,RMAN 也必须连接到 CDB 根容器,不能直接连进 PDB。
错误连接方式会导致命令无反应或报 ORA-19554、ORA-65096。
验证当前连接位置:SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL; 返回值必须是 CDB$ROOT。
正确连接示例:rman target /(确保 OS 用户是 oracle,且 ORACLE_SID 指向 CDB 实例名)。
UNTIL TIME 或 UNTIL SCN 必须显式指定
RMAN 不支持恢复到“最新状态”,漏写时间点会报 RMAN-06571: no recoverable copy of datafile found。
推荐优先用 SCN:先查误操作前一刻的 SCN:SELECT CURRENT_SCN FROM V$DATABASE;,恢复时写 UNTIL SCN 123456789。
避免用模糊时间字符串如 '2026-05-14 14:30:00' —— NLS 设置或时区不一致会导致恢复目标偏移。
时间点必须早于 DROP/ TRUNCATE 的 SCN,且归档日志链不能断;缺关键归档会卡在 ORA-19921: no arc。
AUXILIARY DESTINATION 路径必须可写且空间充足
不指定该参数,RMAN 会在 DB_CREATE_FILE_DEST 下建临时文件,极易因空间不足卡死,错误却只显示 ORA-19809 或 RMAN-03002,不提“磁盘满”。
路径需满足:
– 有足够空间(建议为被恢复对象所在 PDB 数据文件总大小的 2–3 倍)
– Oracle 用户有读写权限:chown oracle:oinstall /u01/oradata/aux、chmod 755 /u01/oradata/aux
– 辅助实例默认日志存于 $ORACLE_BASE/admin/<sid>/adump,也要确保该目录可写
检查恢复区剩余空间:SELECT NAME, SPACE_LIMIT/1024/1024/1024 GB_LIMIT, SPACE_USED/1024/1024/1024 GB_USED FROM V$RECOVERY_FILE_DEST;
恢复后索引、约束、触发器不会自动重建
RECOVER TABLE 只导出数据行,不导出表结构定义、索引、外键、CHECK 约束或触发器。
即使表能查到数据,业务可能已悄然失效(比如主键缺失导致重复插入、NOT NULL 约束未启用)。
若用 REMAP TABLE 恢复为新表名,且原表含显式命名的 NOT NULL 约束(如 CONSTRAINT emp_name_nn CHECK (name IS NOT NULL)),会报 ORA-39083 失败。
稳妥做法:
– 加 NOTABLEIMPORT 参数,只生成 dump 文件
– 手动用 impdp 导入,并加 TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y 和 REMAP_TABLE
– 补约束前先确认依赖对象是否存在,例如索引所属表空间是否可用
SELECT 查 SCN、df -h 看磁盘、ls -ld 看权限,比反复重试更省时间。


















