convert database 在 oracle 11g 跨 endian 平台(如 linux x86_64 → aix powerpc)下必然失败,因其不支持字节序转换,仅 12c 起才通过 transportable=always 补全该功能。
不能直接用 convert database 迁移不同字节序平台(如 linux x86_64 → aix powerpc),oracle 11g 不支持跨 endian 的全库转换。必须拆解为表空间级迁移,且仅限自包含、只读的表空间。
为什么 CONVERT DATABASE 在跨 Endian 场景下必然失败
Oracle 11g 的 CONVERT DATABASE 命令底层依赖数据库处于 OPEN READ ONLY 状态以读取数据字典,但它不处理字节序翻转逻辑;该功能直到 12c 才通过 TRANSPORTABLE=ALWAYS 和自动 endianness 转换补全。在 11g 中强行指定不同 Endian 平台(如从 Linux x86 64-bit 到 AIX-Based Systems (64-bit))会触发 RMAN-06004 或静默中止,且 V$TRANSPORTABLE_PLATFORM 查询结果里二者 ENDIAN_FORMAT 字段值不同(前者 Little,后者 Big),说明 Oracle 明确不允许可直接转换。
-
SELECT PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM WHERE PLATFORM_NAME IN ('Linux x86 64-bit', 'AIX-Based Systems (64-bit)');—— 必须先运行这句确认不可行 - 误在
MOUNT或OPEN READ WRITE下执行CONVERT DATABASE,会报RMAN-03002: failure of convert database command+ 模糊附带错误,不是根本原因 - 即使跳过检查强行执行,生成的 .dbf 文件在目标库
CREATE CONTROLFILE后仍会在RECOVER阶段报ORA-01244: unnamed datafile added或块头校验失败
CONVERT TABLESPACE 是唯一可行路径
11g 支持对单个表空间做跨 Endian 转换,前提是该表空间满足自包含(no dependencies on objects outside)、且可置为只读。它会逐块翻转字节序,并重写文件头,这是 CONVERT DATABASE 所不具备的能力。
- 先在源库执行:
ALTER TABLESPACE ts_name READ ONLY;,否则CONVERT TABLESPACE直接报ORA-19570 - 转换命令必须指定
TO PLATFORM且字符串严格匹配V$TRANSPORTABLE_PLATFORM中的目标平台名,例如:CONVERT TABLESPACE users TO PLATFORM 'AIX-Based Systems (64-bit)' FORMAT '/tmp/converted/users_%U.dbf'; - 目标路径
/tmp/converted/必须存在、Oracle 用户有写权限,否则报ORA-19504: failed to create file - 转换后需手动导出元数据:
expdp system/password TRANSPORT_TABLESPACES=users DUMPFILE=ts_meta.dmp,因为 RMAN 不生成 SQL 脚本或控制文件
目标库还原时必须重建控制文件并小心处理 SCN
跨 Endian 迁移没有现成的控制文件快照可用,BACKUP FOR TRANSPORT DATABASE 在 11g 中也不支持跨 Endian 场景。你只能靠源库的 CREATE CONTROLFILE 脚本(需提前备份)或基于当前状态手写,但要注意:
- 所有
DATAFILE路径必须替换为目标平台实际路径,Windows 反斜杠要改成正斜杠,ASM 别名需映射为磁盘组路径 - 创建后立即执行:
RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;,然后输入CANCEL—— 因为没有归档日志可应用,强制停在当前 SCN - 最后
ALTER DATABASE OPEN RESETLOGS;,否则报ORA-01113: file 1 needs media recovery - 临时表空间、重做日志组、密码文件全部需在目标库手动重建,RMAN 一步不碰
容易被忽略的兼容性硬约束
即便走通 CONVERT TABLESPACE,仍有三个不可绕过的前提条件:字符集必须相同(NLS_CHARACTERSET 值完全一致)、数据库块大小(DB_BLOCK_SIZE)必须相等、且目标库版本不能低于源库(11.2.0.1 → 11.2.0.4 可,反之不行)。任意一项不满足,CREATE CONTROLFILE 或 ALTER DATABASE OPEN 阶段就会卡死,错误信息往往指向文件头或参数校验,而非真实原因。











