必须在cdb$root中执行所有rman pdb恢复命令,因rman元数据、控制文件解析及备份匹配均由cdb统一调度,pdb会话下执行restore database或recover tablespace等命令会触发ora-65023/ora-65086错误或静默失败;正确路径是连接cdb$root后使用recover pluggable database pdb1或restore/recover tablespace pdb1:ts_name,并确保pdb处于closed状态、cdb开启archivelog且归档日志完整。

必须在CDB$ROOT中执行所有RMAN PDB恢复命令
你在PDB里连上RMAN然后敲restore database或recover tablespace users,基本都会失败——不是权限不够,而是Oracle内核根本不允许。RMAN的元数据、控制文件解析、备份集匹配全部由CDB$ROOT统一调度,PDB会话下执行只会触发ORA-65023、ORA-65086或静默跳过。哪怕你用ALTER SESSION SET CONTAINER = pdb1切进去,RMAN依然按CDB上下文干活,大概率去恢复根容器对象。
正确做法只有一条:用sqlplus / as sysdba连进CDB$ROOT,再启动RMAN;所有命令都得在这个上下文中发。别图省事写个tnsnames.ora指向PDB服务名去连,那只是自找麻烦。
恢复单个PDB:用RECOVER PLUGGABLE DATABASE而非RESTORE DATABASE
RESTORE DATABASE在PDB下必然报错,这是多租户架构硬性限制,不是语法或权限问题。真正能走通的路径是RECOVER PLUGGABLE DATABASE pdb1 UNTIL TIME 'SYSDATE-1/24'——它自动完成三件事:还原该PDB专属的数据文件(SYSTEM/SYSAUX + 用户表空间)、应用归档日志到指定时间点、跳过其他PDB的变更记录。
- 执行前必须确认:
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL返回CDB$ROOT - 目标PDB必须处于
CLOSED状态:ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE - CDB必须开启
ARCHIVELOG模式,且归档日志链完整覆盖目标时间点 - 该命令不要求单独做过
BACKUP PLUGGABLE DATABASE,只要CDB全备里含该PDB数据即可
只恢复某个表空间:必须带pdb_name:tablespace_name前缀
想救一个损坏的用户表空间?别写RESTORE TABLESPACE users,这默认作用于CDB$ROOT,极可能把根容器搞崩。必须显式带上PDB限定符:RESTORE TABLESPACE pdb1:users。RMAN靠这个前缀过滤备份集、映射路径、识别容器状态。
常见踩坑点:
-
RMAN-06023不是备份丢了,而是没注册备份片——检查CATALOG START WITH '/backup/path'是否覆盖实际存放位置 - PDB在备份时是READ ONLY状态,RMAN默认不备份只读表空间,需加
INCLUDE CURRENT CONTROLFILE或显式指定 - 恢复后必须验证:
SELECT status FROM v$tablespace WHERE name = 'USERS' AND con_id = (SELECT con_id FROM v$pdbs WHERE pdb_name = 'PDB1'),确保状态为ONLINE
已DROP的PDB无法直接恢复,必须重建CDB骨架
一旦执行过DROP PLUGGABLE DATABASE pdb1 INCLUDING DATAFILES,RMAN就再也“认不出”这个PDB了——CDB_PDBS视图清空,CON_ID丢失,RECOVER PLUGGABLE DATABASE直接报RMAN-06813。这时候不存在“恢复单个PDB”的捷径,只能两步走:
- 先用
RESTORE CONTROLFILE→RESTORE DATABASE UNTIL TIME 'xxx'→RECOVER DATABASE UNTIL TIME 'xxx',把整个CDB恢复到DROP之前的时间点 - 再从重建后的CDB中提取PDB:优先用
FLASHBACK PLUGGABLE DATABASE pdb1 TO BEFORE DROP(19c 19.11+),其次查有没有UNPLUG INTO '/path/pdb.xml'留下的XML文件,最后才是手动COPY数据文件+CREATE PLUGGABLE DATABASE ... AS CLONE
最易被忽略的是第一步的RESTORE CONTROLFILE——漏掉它,后续所有命令都会卡在ORA-01507: database not mounted。时间点也必须严格早于DROP操作发生时刻,差一分钟都不行。











