能恢复,但必须确保PDB未被DROP、CDB处于MOUNT状态、RMAN命令明确指定pdb_name:tablespace_name格式;否则报RMAN-06023或误恢复至CDB$ROOT的SYSTEM表空间。

能恢复,但必须确保 PDB 未被 DROP、CDB 处于 MOUNT 状态、RMAN 命令中明确指定 pdb_name:datafile 或 pdb_name:tablespace_name 格式;否则会报 RMAN-06023,甚至误恢复到 CDB$ROOT 的 SYSTEM 表空间,把库搞挂。
为什么 RESTORE DATAFILE 单独用不 work?
Oracle 12c 中 PDB 的数据文件不是独立注册在 CDB 控制文件里的“裸路径”,而是绑定在 PDB 容器上下文中的逻辑实体。直接写 RESTORE DATAFILE '/path/to/pdb1_users01.dbf' 会被 RMAN 忽略或报 ORA-19570(文件不在控制文件中)。
- 必须通过容器名+逻辑标识定位:例如
RESTORE DATAFILE 12(查DBA_DATA_FILES得到 file_id),或更稳妥地用RESTORE TABLESPACE pdb1:USERS -
RESTORE DATAFILE在 PDB OPEN 状态下可能成功执行,但后续RECOVER会卡住——因为文件句柄仍被 PDB 持有,ORA-01153就是典型表现 - 如果只删了某个
.dbf(如users01.dbf),但没删整个表空间,优先走TABLESPACE级恢复,它会自动拉取该表空间下所有数据文件
RESTORE TABLESPACE pdb1:USERS 的三个硬前提
这条命令看着简单,缺一不可,否则 RMAN 不报错但做无用功,或破坏根容器。
- CDB 必须处于
MOUNT状态:STARTUP MOUNT(不是OPEN,也不是NOMOUNT) - PDB 必须未被
DROP:运行SHOW PDBS,确认pdb1仍在列表中,状态为MOUNTED或READ WRITE;若为OPEN,先执行ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE - 备份中必须含该 PDB 表空间:在 RMAN 中运行
LIST BACKUP OF TABLESPACE pdb1:USERS,有输出才能继续;若返回空,说明备份集里没存这个 PDB 的该表空间(常见于只备份了 CDB$ROOT 或用了BACKUP DATABASE但没加PLUS ARCHIVELOG)
恢复后 ALTER PLUGGABLE DATABASE pdb1 OPEN 报 ORA-01113 怎么办?
这不是恢复失败,而是状态没同步。RMAN RECOVER 完成后,数据文件物理上已就位,但控制文件里的检查点 SCN 和文件头的 checkpoint SCN 还不一致。
- 先查实际路径是否匹配:
SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'USERS' AND CON_ID = (SELECT CON_ID FROM V$PDBS WHERE NAME = 'PDB1'),比对 RMAN 日志中还原到的路径 - 确认归档日志可用:
LIST ARCHIVELOG ALL看是否有覆盖恢复目标 SCN 的日志;缺失会报ORA-19505或ORA-19625 - 别手动
ALTER DATABASE DATAFILE ... ONLINE——RMANRECOVER会自动处理 offline/online 状态,强行 online 可能导致 ORA-01122 - 最后强制校验:
ALTER SYSTEM CHECKPOINT;再试 open
最易被忽略的一点:恢复前没确认当前容器。用 sqlplus / as sysdba 连上去,第一件事就是 SHOW CON_NAME,确保是 CDB$ROOT;如果误连进某个 PDB,RESTORE 命令根本不会生效。


















