不能。DROP PLUGGABLE DATABASE ... INCLUDING DATAFILES 会彻底删除元数据和物理文件,RMAN 因无法匹配 CON_ID 和 DBID 而找不到恢复目标,仅当保留 UNPLUG XML 文件时才可通过 PLUG 方式重建。
rman 不能直接“还原一个被 drop pluggable database ... including datafiles 删除的 pdb”——这不是备份缺失的问题,而是元数据和物理文件双重销毁。你必须先判断:是 pdb 数据文件被误删但 pdb 仍存在(未 drop),还是 pdb 已被显式 drop(含 datafiles)?二者恢复路径完全不同,混用必失败。
DROP PLUGGABLE DATABASE 后还能用 RMAN 恢复吗?
不能。DROP PLUGGABLE DATABASE pdb_name INCLUDING DATAFILES 会触发三件事:
- 从
CDB$ROOT的数据字典中删除该 PDB 的所有元数据(CDB_PDBS,CDB_DATA_FILES等视图里彻底消失) - ASM 或文件系统中对应的数据文件、临时文件、控制文件副本(如果有的话)被同步清除
- RMAN 备份集中该 PDB 的备份片仍存在,但恢复时无法识别目标 —— 因为 RMAN 依赖
CON_ID和DBID匹配,而 drop 后新建同名 PDB 的CON_ID已变,旧备份无法关联
你看到的典型错误是:RMAN-06023: no backup or copy of datafile X found to restore
或RMAN-06026: some targets not found - aborting restore
此时 RMAN 不是“没找到备份”,而是“找不到匹配的恢复目标”。
RMAN RESTORE TABLESPACE 只适用于“PDB 未 drop,仅文件丢失”
这是最常被误用的场景。当 PDB 仍在 CDB$ROOT 中注册(SHOW PDBS 能看到),但某个数据文件被 rm 或磁盘损坏,可走标准 RMAN 恢复流程:
- 确保数据库处于
MOUNT状态(CDB 必须 mount,PDB 不需 open) - 连接 RMAN 并指定目标 PDB:
RMAN> CONNECT TARGET / - 执行恢复:
RMAN> RESTORE TABLESPACE pdb_name:USERS;RMAN> RECOVER TABLESPACE pdb_name:USERS;
关键点:
- 表空间名前必须带
pdb_name:前缀,否则 RMAN 默认操作 CDB$ROOT - 不需要
ALTER PLUGGABLE DATABASE pdb_name CLOSE,RMAN 会自动处理 offline/online - 恢复后直接
ALTER PLUGGABLE DATABASE pdb_name OPEN即可
若执行 RESTORE DATABASE 或不带前缀的 RESTORE TABLESPACE USERS,RMAN 会尝试恢复 CDB$ROOT 的表空间,完全跑偏。
UNPLUG/PLUG 是唯一能绕过 DROP 元数据丢失的补救手段
只有在当初执行 DROP 前,你曾做过 ALTER PLUGGABLE DATABASE pdb_name UNPLUG INTO '/path/pdb.xml',才能用此法抢救:
-
DROP PLUGGABLE DATABASE pdb_name(不含INCLUDING DATAFILES)只是卸载,文件还在 - 但
INCLUDING DATAFILES会连 XML 文件一起删掉 —— 如果 XML 已丢,这条路就断了
若 XML 尚存,操作如下:
-
DROP PLUGGABLE DATABASE pdb_name(确保干净) -
CREATE PLUGGABLE DATABASE pdb_name USING '/path/pdb.xml' NOCOPY; -
ALTER PLUGGABLE DATABASE pdb_name OPEN RESTRICTED; - 然后立刻用 RMAN 备份新 PDB —— 因为它的
CON_ID已变,旧备份对它无效
注意:NOCOPY 要求源数据文件路径与当前一致;若路径变了,得用 COPY + MOVE,且需额外空间。
真正难的不是命令怎么写,而是故障发生瞬间你手边有没有那几个关键东西:PDB 的 XML 插拔文件、最近一次 RMAN 备份的完整性和可用性、ASM 的 FILEDIR 是否完好。少一个,RMAN 就只能帮你恢复“已知存在”的东西,而不是“你以为它还在”的东西。


















