rman不支持租户级自动隔离备份,必须通过sysbackup直连指定pdb实现逻辑隔离;备份需在archivelog模式下进行,且须人工规范路径命名、校验pdb状态。

必须明确一点:RMAN 本身不提供“租户级隔离备份”的抽象能力,它只按物理对象(数据文件、表空间、PDB)执行备份;真正的隔离靠的是连接上下文、权限控制和备份目标的显式指定——不是自动的,是人为划定的。
用 SYSBACKUP 连接特定 PDB 才能实现逻辑隔离
RMAN 不会自动识别“当前租户”,它只认连接串或环境变量指向的数据库实例。如果用 rman target / 连 CDB$ROOT,哪怕后续执行 backup pluggable database pdb2,也仍处于 CDB 上下文,所有操作都受 CDB 级权限约束。
要真正把备份行为限制在单个 PDB 内部(比如避免误备其他 PDB 的表空间),必须用 SYSBACKUP 用户直连该 PDB:
-
rman target sysbackup/oracle@pdb2—— 这样 RMAN 会话天然绑定到pdb2,backup database只会备份pdb2自身的数据文件 - 此时
report schema输出中只显示pdb2的表空间和数据文件,不可能看到pdb3或CDB$ROOT的内容 - 即使执行
backup tablespace users,也只会备份pdb2中的USERS表空间,不会跨租户 - 若用普通
SYSDBA连 CDB 后再切容器(alter session set container=pdb2),RMAN 仍不感知容器切换,该命令对 RMAN 无效
backup pluggable database 命令只在 CDB 上下文有效
这个命令看似“针对 PDB”,实则必须在 CDB$ROOT 中执行,且依赖 CDB 级权限。它不是租户内操作,而是 CDB 主动调度对某个 PDB 的备份。
常见误操作和后果:
- 在 CDB 中执行
backup pluggable database pdb2,但pdb2处于MOUNTED状态 → 备份失败,报错RMAN-06004: ORACLE error from target database: ORA-65086: cannot open pluggable database - 未开启归档模式 → 即使 PDB OPEN,也会报
RMAN-06817: Pluggable Database ... cannot be backed up in NOARCHIVELOG mode - 指定了
format但路径在多个 PDB 共享的 FRA 下 → 备份集物理上不隔离,需靠命名规范或目录结构人工区分 - 执行时未确认
v$pdbs.status,误对正在刷新的 PDB(REFRESHING状态)发起备份 → 可能卡住或报ORA-65126
备份输出路径与命名必须人工隔离,RMAN 不自动打标
RMAN 不会在备份片(backuppiece)文件名里写入 PDB 名或租户 ID。如果你在 CDB 中执行 backup pluggable database pdb2 format '/bkp/pdb2_%U' 和 backup pluggable database pdb3 format '/bkp/pdb3_%U',那路径和前缀是你自己加的,不是 RMAN 功能。
关键实践建议:
- 绝对不要把所有 PDB 备份混存到同一目录,比如
/bkp/all/—— 恢复时无法快速定位,巡检易漏 - 推荐按
/bkp/<code>pdb_name/full/ 或/bkp/<code>cdb_name/pdb_pdb_name/ 分层组织 - 在脚本中强制拼接 PDB 名:
backup pluggable database &pdb_name format '/bkp/&cdb_name/&pdb_name/db_%d_%U'; - 若使用 FRA,务必配合
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '...%F';并确保 FRA 路径本身有租户维度(如/fra/cdb1/pdb2/)
权限与归档模式是硬门槛,不是可选项
没有 SYSBACKUP 权限或没开归档,所谓“租户隔离备份”就是空谈。这两项一旦缺失,要么操作被拒,要么备份不可恢复。
检查清单:
- 确认
v$database.log_mode = 'ARCHIVELOG'——NOARCHIVELOG下连backup database root都会失败 - 确认用户具有
SYSBACKUP角色(不是SYSDBA):select * from dba_role_privs where grantee = 'SYSBACKUP'; - 确认 PDB 已开放且状态为
READ WRITE:select name,open_mode from v$pdbs where name='PDB2'; - 若用 OS 认证(
rman target /),必须确保ORACLE_SID指向目标 CDB,且tnsnames.ora中服务名正确映射到对应 PDB
最常被忽略的一点:备份脚本里没做 PDB 状态校验,直接跑 backup pluggable database,结果某 PDB 因资源不足自动 UNPLUG 了,备份就永远卡在等待上——得先查 v$pdbs,再动手。











