不能直接对单个pdb执行restore database,必须在cdb$root中使用restore pluggable database + recover pluggable database组合;需先关闭目标pdb、确认cdb处于archivelog模式,并显式指定until子句,恢复后须open resetlogs。

不能直接对单个PDB执行 RESTORE DATABASE,RMAN在CDB级别运行,该命令会尝试恢复整个CDB——哪怕你写了 RESTORE DATABASE PLUGGABLE DATABASE pdb1,Oracle也会报 ORA-65086 或 RMAN-06813 错误。真正可行的路径只有一条:用 RESTORE PLUGGABLE DATABASE + RECOVER PLUGGABLE DATABASE 组合,在CDB$ROOT中操作。
必须连到CDB$ROOT,不能连到PDB或PDB服务名
这是最常踩的坑。即使你只想恢复 pdb1,RMAN会话也必须连接到根容器,否则命令根本不可见或被忽略。
- 正确方式:
sqlplus / as sysdba→SHOW CON_NAME确认输出是CDB$ROOT;再启动RMAN:rman target / - 错误方式:用
tnsnames.ora配置指向PDB的服务名连接,或执行ALTER SESSION SET CONTAINER = pdb1后再进RMAN —— 此时RESTORE PLUGGABLE DATABASE语法不识别,RECOVER PLUGGABLE DATABASE直接报错ORA-65047: operation not allowed from within a pluggable database - 验证当前容器:
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;必须返回CDB$ROOT
RESTORE PLUGGABLE DATABASE 前必须关闭目标PDB
RESTORE PLUGGABLE DATABASE 不要求PDB处于MOUNT状态,但它要求PDB已关闭(CLOSED),否则RMAN跳过还原、后续 RECOVER 失败。
- 执行:
ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE; - 检查状态:
SELECT NAME, OPEN_MODE FROM V$PDBS WHERE NAME = 'PDB1';输出应为CLOSED - 如果PDB处于
MOUNTED或READ WRITE,RMAN可能静默跳过部分数据文件还原,导致恢复后OPEN时报ORA-01157: cannot identify/lock data file - 注意:不需要SHUTDOWN IMMEDIATE整个CDB,只关PDB即可
RECOVER PLUGGABLE DATABASE 必须带 UNTIL 子句
Oracle 21c不支持“完全恢复到最新归档”这种无条件恢复。哪怕你只想恢复到最后一个归档日志,也必须显式指定 UNTIL TIME、UNTIL SCN 或 UNTIL LOGSEQ —— 否则报错 RMAN-03002: failure of recover command + ORA-19625: error identifying file。
- 常用写法:
RECOVER PLUGGABLE DATABASE pdb1 UNTIL TIME "TO_DATE('2026-07-21 04:30:00','YYYY-MM-DD HH24:MI:SS')"; - SCN方式:
RECOVER PLUGGABLE DATABASE pdb1 UNTIL SCN 12345678;(需先查SELECT CURRENT_SCN FROM V$DATABASE;) - 时间必须早于所有归档日志覆盖范围,且CDB必须处于
ARCHIVELOG模式 ——SELECT LOG_MODE FROM V$DATABASE;返回ARCHIVELOG - 注意:
UNTIL TIME使用服务器系统时间(SYSTIMESTAMP),不是PDB时区,别用SYSDATE - 1/24这类表达式,避免因RMAN解析延迟导致时间偏移
恢复后OPEN要带 RESETLOGS(仅限不完全恢复)
如果用了 UNTIL(即不完全恢复),ALTER PLUGGABLE DATABASE pdb1 OPEN 会失败,提示 ORA-01589: must use RESETLOGS or NORESETLOGS option for database open。
- 正确操作:
ALTER PLUGGABLE DATABASE pdb1 OPEN RESETLOGS; - RESETLOGS会重置PDB的内部SCN序列,生成新的在线日志组,但不影响其他PDB
- 如果没用
UNTIL(极少见,仅当有完整归档链且未中断时),才可用OPEN,但21c实践中几乎不存在这种场景 - OPEN后立即检查:
SELECT NAME, OPEN_MODE, STATUS FROM V$PDBS WHERE NAME = 'PDB1';应为READ WRITE和ONLINE
最容易被忽略的是备份有效性验证——LIST BACKUP OF PLUGGABLE DATABASE pdb1 必须返回至少一条有效备份记录,且其 COMPLETION TIME 要早于你指定的 UNTIL 时间点。没有备份,RESTORE 会静默失败,RECOVER 则直接报 ORA-19625 并中断流程。











