RMAN 不支持跨 CDB 直接 restore PDB,必须通过 unplug→backup for transport→restore using XML 路径迁移;需确保字符集、字节序、LOCAL_UNDO_ENABLED 一致,并执行 dbms_pdb.describe() 生成 XML。
直接用 RMAN restore foreign pluggable database 会失败
oracle 19c 的 rman 不支持跨 cdb 直接 restore 某个 pdb 的备份集(比如你从源 cdb 备份了 pdb1,想在目标 cdb 里用 restore pluggable database pdb1 恢复)——这会报 rman-07518: reason: foreign database file dbid: xxxxx database name: xxxdb。根本原因是 pdb 的数据文件头里硬编码了源 cdb 的 dbid 和 db_name,rman 在目标 cdb 中校验不通过,拒绝加载。
必须走“拔出(unplug)→传输→插入(plug)”路径,不能跳过元数据描述文件(XML)和兼容性检查。
- 不能只拷贝数据文件或备份集就试图 restore;
- 不能省略
dbms_pdb.describe()生成 XML 这步; - 目标 CDB 的
DB_NAME可以和源不同,但字符集、字节序、LOCAL_UNDO_ENABLED必须一致; - 源 PDB 必须处于
READ ONLY或已关闭状态才能执行unplug。
必须先 unplug + backup for transport,不能只用 backup pluggable database
backup pluggable database PDB1 只是物理备份,不包含可插拔所需的元数据(如表空间映射、用户默认表空间、字符集声明等),无法用于跨 CDB 插入。真正能迁移的命令是:
BACKUP FOR TRANSPORT UNPLUG INTO '/path/to/PDB1.xml' FORMAT '/path/to/PDB1_bkp_%U' PLUGGABLE DATABASE PDB1;
这条命令会做三件事:① 自动关闭 PDB;② 生成符合 dbms_pdb.check_plug_compatibility() 校验要求的 XML;③ 把数据文件打包进备份集,并标记为“foreign”类型。
- 执行后,源 CDB 中该 PDB 状态变为
UNPLUGGED(SELECT pdb_name, status FROM cdb_pdbs可查); - XML 文件必须和备份集一起传到目标端,缺一不可;
- 如果目标端已有同名 PDB,需先
DROP PLUGGABLE DATABASE ... INCLUDING DATAFILES,否则restore会报错。
restore using XML 必须指定 foreign 和 format,且路径要匹配
在目标 CDB 的 RMAN 中执行插入时,语法不是简单的 restore pluggable database,而是:
RESTORE USING '/path/to/PDB1.xml' FOREIGN PLUGGABLE DATABASE PDB1 FORMAT '/opt/oracle/oradata/CDB1/PDB1/%U' FROM BACKUPSET '/path/to/PDB1_bkp_XXXX';
关键点:
-
FOREIGN关键字不可省略,它告诉 RMAN 这是来自其他 CDB 的 PDB; -
FORMAT指定目标端数据文件落地路径,必须是实际存在的目录,且有写权限; -
FROM BACKUPSET后面的路径必须指向备份集文件(不是目录),且 RMAN 能访问到(建议用绝对路径); - 执行前确保目标 CDB 已启用
LOCAL_UNDO(SELECT property_value FROM database_properties WHERE property_name = 'LOCAL_UNDO_ENABLED'返回TRUE); - 插入完成后,PDB 默认是
MOUNTED状态,需手动ALTER PLUGGABLE DATABASE PDB1 OPEN。
字符集和平台差异导致的兼容性问题最常被忽略
即使 XML 校验返回 TRUE,实际打开 PDB 时仍可能报 ORA-65139: The pluggable database's data files are not compatible 或字符乱码。这是因为:
-
dbms_pdb.check_plug_compatibility()只检查基础结构兼容性,不校验字符集转换是否安全; - 若源 CDB 是
ZHS16GBK,目标 CDB 是AL32UTF8,直接插入会导致中文字段损坏(需提前用expdp/impdp或DBMS_PDB.DESCRIBE+ 手动调整); - 平台字节序不一致(如源是 Linux x86-64,目标是 AIX)会导致数据文件读取失败,必须用
CONVERT DATABASE或 Data Pump; - 目标 CDB 的
NLS_CHARACTERSET必须等于或超集源 PDB 的字符集(可通过SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'对比)。
真正卡住的地方往往不是 RMAN 命令本身,而是 XML 里没暴露的字符集隐式转换风险和 undo 表空间归属冲突——这些只有在 OPEN 阶段才暴露。


















