rman convert database 不支持 cdb 迁移,仅适用于非cdb;在cdb中执行会报rman-06136或rman-03002,因其无法解析跨容器元数据,必须改用xtts逐pdb迁移。

RMAN CONVERT DATABASE 不支持 CDB 迁移 —— 你无法直接对整个 CDB 执行该命令,否则会报 RMAN-06136 或静默失败。
CONVERT DATABASE 在 CDB 下根本不可用
Oracle 官方文档和实测均确认:CONVERT DATABASE 命令仅适用于非 CDB(即传统单租户数据库)。在 CDB 环境中执行该命令,RMAN 会拒绝解析,报 RMAN-06136 或 RMAN-03002 并附带模糊提示(如 “failed to allocate channel”),不是权限或路径问题,而是语法层面不被接受。
- CDB 的元数据分散在 ROOT 和各 PDB 中,
CONVERT DATABASE无法安全读取跨容器的表空间路径、文件头、块大小等关键信息 - 即使强行
ALTER DATABASE OPEN READ ONLY,RMAN 仍无法构建一致的转换上下文 —— 它压根不识别 CDB 架构下的V$PDBS或CDB_DATA_FILES - 试图在 MOUNT 状态下运行只会让错误更早暴露,且无法跳过 OPEN READ ONLY 阶段(该阶段本身在 CDB 中就受限)
必须拆解为 PDB 级别迁移:先导出元数据,再逐个传输表空间
针对 CDB 到异构平台(如 Linux → Windows),唯一可行路径是 XTTS(Cross Platform Transportable Tablespaces),而非全库 CONVERT。核心逻辑是绕过 CDB 容器结构,只操作物理数据文件与字典元数据。
- 源 CDB 必须处于
OPEN READ ONLY状态(注意:是整个 CDB,不是单个 PDB) - 每个待迁移的 PDB 需单独验证自包含性:
DBMS_TTS.TRANSPORT_SET_CHECK要针对PDB$SEED以外的每个 PDB 运行 - 字符集必须兼容:源 PDB 与目标 CDB 的
NLS_CHARACTERSET不能有不可逆转换(如 AL32UTF8 → WE8MSWIN1252) - 目标平台必须与源端具有相同
ENDIAN_FORMAT;若不同(如 Solaris SPARC → Linux x86_64),只能走 XTTS 增量方式,且需额外CONVERT DATAFILE步骤
XTTS 迁移中三个致命易错点
XTTS 表面是脚本自动化,实际每一步都卡在细节上。以下三点踩中任意一个,就会导致数据不一致或启动失败:
-
xtt.properties中的platformid必须与V$TRANSPORTABLE_PLATFORM.PLATFORM_NAME完全一致 —— 比如写Linux x86 64-bit合法,但linux-x86_64或Linux x86-64全部触发RMAN-06004 - 增量备份生成的 SCN 必须严格连续:第 1 次增量用
FROM_SCN=A,第 2 次必须用FROM_SCN=B+1(B 是上次增量的TO_SCN),漏掉 +1 就会丢失事务 - 目标端创建新 CDB 后,
CREATE PLUGGABLE DATABASE ... USING的 XML 文件必须由源 PDB 的DBMS_PDB.DESCRIBE生成,不能手写或复用旧文件 —— 文件里硬编码了数据文件 checksum 和 block header 校验值
真正难的从来不是命令怎么敲,而是判断哪一层状态没对齐:CDB 的 open mode、PDB 的 read only 状态、XTTS 脚本里的 platformid 大小写、甚至 rman_xttconvert_v3.zip 解压后文件权限是否为 oracle 可读 —— 少一个,xttdriver.pl -p 就会在第 3 步静默退出。











