备份oracle 12c多租户数据库的关键是:连对容器(cdb或pdb)、明确备份范围(cdb/root/pdb)、且必须启用归档模式,否则rman报错或备份集不可见。

直接说结论:备份 Oracle 12c 多租户数据库,核心不是“能不能”,而是“连到哪、备什么、归档开了没”。错连目标或忽略归档模式,BACKUP DATABASE 会直接报 RMAN-06817 或备份集对其他 PDB 不可见。
连接方式决定备份范围
RMAN 的行为严格取决于你连接的是 CDB 还是某个 PDB,不是靠命令里写不写 PLUGGABLE DATABASE 来判断。
- 用
target /连到 CDB(即ORACLE_SID对应的实例),BACKUP DATABASE默认备份整个 CDB:CDB$ROOT + PDB$SEED + 所有 open 状态的 PDB - 用服务名连到单个 PDB,例如
rman target sys/oracle@pdb1,此时BACKUP DATABASE只备份该 PDB,且备份集只在该 PDB 和 ROOT 中可见,其他 PDB 查不到 - 想只备份根容器?必须显式写
BACKUP DATABASE ROOT,但前提是数据库已启用归档模式,否则报RMAN-06817
归档模式是硬门槛,不是可选项
只要涉及 ROOT、PLUGGABLE DATABASE 或需要增量备份/不完全恢复,就必须开归档。CDB 级别统一控制,PDB 自己不能单独开关。
- 检查状态:
SELECT name, log_mode FROM v$database;—— 必须返回ARCHIVELOG - 关闭数据库:
SHUTDOWN IMMEDIATE,再STARTUP MOUNT,然后ALTER DATABASE ARCHIVELOG; - 没开归档时执行
BACKUP DATABASE ROOT或BACKUP PLUGGABLE DATABASE pdb1 PLUS ARCHIVELOG都会失败 - 归档路径建议用 FRA(闪回恢复区),避免手动管理归档位置出错
PDB 级备份的典型命令与坑点
对单个 PDB 备份看似简单,但权限、状态、上下文稍有偏差就会失败或备份无效。
- 必须用具备
SYSBACKUP或SYSDBA权限的用户操作,普通 DBA 权限不够 - PDB 必须处于
READ WRITE或READ ONLY状态;MOUNTED状态下 RMAN 看不见它 - 正确命令示例:
BACKUP PLUGGABLE DATABASE pdb1 FORMAT '/backup/pdb1_%U.bkp'; - 错误写法:
BACKUP DATABASE连到 ROOT 后加FOR TRANSPORT—— 这不是 PDB 备份,是传输表空间准备步骤 - 恢复时注意:先
ALTER PLUGGABLE DATABASE pdb1 CLOSE;,再RESTORE,否则报ORA-65092
备份集可见性常被忽略
同一个备份集,在不同连接上下文中“存在感”完全不同——这不是 bug,是设计逻辑。
- 连 ROOT 执行
BACKUP PLUGGABLE DATABASE pdb1,该备份集在 ROOT 和 pdb1 内可见,但在 pdb2 的 RMAN 会话里LIST BACKUP查不到 - 连 pdb1 执行
BACKUP DATABASE,备份集只在 pdb1 和 ROOT 中注册,ROOT 的LIST BACKUP能看到,但别的 PDB 看不到 - 跨 PDB 恢复必须确保备份集在目标 PDB 上下文中可见,否则
RESTORE会提示找不到备份片 - 如果依赖恢复目录(Recovery Catalog),所有备份信息统一注册,能绕过这个可见性限制,但增加了运维复杂度
真正麻烦的从来不是敲哪条命令,而是搞清当前 session 在哪个容器、归档是否生效、备份集归属在哪几个 PDB 的元数据视图里——这些细节不验证,RESTORE 时才发现备份“不存在”,已经晚了。











