一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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-65086RMAN-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$ROOTSYSTEM 表空间的主因。

最常被忽略的一点:恢复完成后,必须用 ALTER PLUGGABLE DATABASE pdb1 OPEN RESETLOGS; 打开,否则 PDB 仍处于 MOUNT 状态,无法访问。

热门栏目