最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Oracle 12c RMAN如何恢复PDB到指定时间?
时间:2026-08-25 09:37:47 编辑:袖梨 来源:一聚教程网
必须在CDB$ROOT中执行RECOVER PLUGGABLE DATABASE,因PDB无独立控制文件、SPFILE及完整数据文件集,所有物理结构归属CDB;连PDB执行RESTORE/RECOVER会因作用域受限导致无法获取完整数据文件列表、无法应用归档日志,报ORA-65086或RMAN-06026等错误。
必须在 CDB$ROOT 中执行 RECOVER PLUGGABLE DATABASE,且目标 PDB 不能已被 DROP —— 这是唯一合法路径。
为什么不能连 PDB 执行 RESTORE/RECOVER?
当你用 rman target / 连入某个 PDB(比如 pdb1)后执行 RESTORE DATABASE,RMAN 实际仍依赖 CDB 的控制文件,但作用域被限制在 PDB 视图内:它无法获取该 PDB 完整的数据文件列表(例如 SYSTEM 文件路径可能指向 CDB 公共位置),也无法触发归档日志应用。常见报错包括:ORA-65086、RMAN-06026,或静默跳过不还原任何文件。
根本原因在于:PDB 没有独立的控制文件、SPFILE 和完整数据文件集,所有物理结构归属 CDB。RMAN 只允许在 CDB$ROOT 中执行全库级还原动作。
验证当前容器:
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;
返回值必须是 CDB$ROOT,否则后续命令无效。
恢复前必须满足的三个硬性条件
- 目标 PDB 必须仍存在于 SHOW PDBS 输出中(即未被 DROP PLUGGABLE DATABASE)
- CDB 必须处于 ARCHIVELOG 模式
- 归档日志链必须覆盖目标时间点(缺失任意一段 sequence,RECOVER 会卡住不报错)
执行前关闭目标 PDB:
ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE;
确保归档可用性:
SELECT NAME, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG WHERE FIRST_TIME >= SYSDATE - 1 ORDER BY FIRST_TIME;
核心命令与关键参数含义
在 CDB$ROOT 中执行:
RECOVER PLUGGABLE DATABASE pdb1 UNTIL TIME 'SYSDATE-1/24';
这条命令自动完成三件事:
- 还原该 PDB 关联的数据文件(仅限其用户表空间 + SYSTEM/SYSAUX)
- 应用归档日志到指定时间点
- 跳过其他 PDB 的变更记录
注意:
- 不要求事先存在 BACKUP PLUGGABLE DATABASE;只要 CDB 备份中包含该 PDB 数据即可
- UNTIL TIME 支持字符串格式(如 '2026-07-27 14:30:00')或表达式(如 SYSDATE-1/24)
- 时间精度为秒,但实际恢复粒度取决于归档日志切换频率
容易踩的坑:表空间级恢复的写法陷阱
如果只是某个 PDB 的非关键数据文件丢失(如用户表空间 USERS),可在 CDB$ROOT 中直接还原特定表空间,但写法极其严格:
- 绝对不能写:RESTORE TABLESPACE USERS —— 这默认作用于 CDB$ROOT,极大概率覆盖根容器表空间
- 必须带前缀:RESTORE TABLESPACE pdb1:USERS;,RMAN 才能识别容器、过滤专属备份、映射正确路径
- CDB 必须处于 MOUNT 状态(STARTUP MOUNT),PDB 不需要 OPEN,但建议先 CLOSE
- RESTORE 只拷贝文件,RECOVER TABLESPACE pdb1:USERS; 才真正应用归档日志;两者必须成对使用,顺序不可颠倒
漏掉 pdb1: 前缀,是 RMAN-06023 和误恢复至 CDB$ROOT 的 SYSTEM 表空间的主因。
最常被忽略的一点:恢复完成后,必须用 ALTER PLUGGABLE DATABASE pdb1 OPEN RESETLOGS; 打开,否则 PDB 仍处于 MOUNT 状态,无法访问。