rman在cdb根执行backup database仅备份cdb$root、pdb$seed及当前open状态的pdb,不包含mounted或read only的用户pdb;归档日志全量备份,但数据文件范围严格受限于执行时刻的v$pdbs.open_mode。
rman 在 cdb 根容器中执行 backup database,默认不备份用户创建的 pdb,除非它们当前处于 open 状态——这是最常导致“以为全备了,实际漏了”的根源。
BACKUP DATABASE 在 CDB$ROOT 中到底备份什么
- 只备份
CDB$ROOT、PDB$SEED和 当前会话连接时处于OPEN状态的 PDB - 如果你运行
BACKUP DATABASE前没检查 PDB 状态,而PDB1是MOUNTED或READ ONLY,它就不会进备份集 - 归档日志(
ARCHIVELOG)部分不受影响,仍会全量备份;但数据文件只覆盖当前OPEN的容器
确认当前哪些 PDB 是 OPEN:
SELECT NAME, OPEN_MODE FROM V$PDBS;
常见错误现象:
- 备份完成后
LIST BACKUPSET显示只有 4 个数据文件(对应 ROOT + SEED),却以为“整个 CDB 都备好了” - 恢复时发现某个 PDB 的数据文件根本不在备份集中,报错
RMAN-06023: no backup or copy of datafile ... found to restore
如何确保所有 PDB 都被包含进 BACKUP DATABASE
必须满足两个硬性前提:
- 所有目标 PDB 已显式打开:
ALTER PLUGGABLE DATABASE pdb1, pdb2 OPEN; - RMAN 连接的是 CDB 根(即未切换
CONTAINER),且已配置通道(否则报RMAN-06207: no channels allocated)
示例流程:
rman target /
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u01/backup/%U';
ALTER PLUGGABLE DATABASE pdb1, pdb2 OPEN;
BACKUP DATABASE PLUS ARCHIVELOG;
注意:PLUS ARCHIVELOG 不改变数据文件的备份范围,只额外归档日志——别指望它“捎带”上没开的 PDB。
BACKUP DATABASE ROOT 和 BACKUP DATABASE 的本质区别
-
BACKUP DATABASE ROOT:明确限定只备份根容器,忽略所有 PDB(包括PDB$SEED),适合单独保护元数据 -
BACKUP DATABASE:语义是“整个数据库”,但在多租户下行为取决于运行时 PDB 状态,不是静态定义的范围
关键差异点:
-
BACKUP DATABASE ROOT总是安全、可预测,恢复也只涉及 ROOT -
BACKUP DATABASE的结果每次可能不同,依赖V$PDBS.OPEN_MODE快照,自动化脚本里必须前置状态校验
容易被忽略的权限与连接细节
- 必须用
SYSDBA或SYSBACKUP权限连接,普通 DBA 用户不行 - 操作系统认证下,
rman target /要求当前 OS 用户属于dba组,且ORACLE_SID正确设置 - 若使用密码文件认证,连接串必须带
AS SYSDBA或AS SYSBACKUP,例如:rman target "sys/oracle@cdb1 AS SYSBACKUP"
最后提醒:CDB 备份不是“一劳永逸”。PDB 状态变化(如新创建、关闭、只读)都会直接影响下一次 BACKUP DATABASE 的覆盖范围,不能靠记忆或文档推断,每次执行前查 V$PDBS 是唯一可靠方式。











