Oracle 11g跨平台迁移表空间必须用CONVERT TABLESPACE逐表空间转换字节序并配合expdp/impdp导出导入元数据,因CONVERT DATABASE不支持跨Endian,且仅限自包含、只读表空间;需严格匹配v$transportable_platform中平台名及ENDIAN_FORMAT。跨平台迁移表空间数据文件在 Oracle 11g 中**不能直接用 `CONVERT DATABASE` 或 `impdp` 自动处理字节序转换**——这是最常踩的坑。必须拆解为「表空间级 RMAN 转换 + 数据泵元数据导出导入」两步走,且仅限自包含、只读的表空间。
确认源库和目标库 ENDIAN_FORMAT 是否一致
这是前置硬门槛,不满足就根本走不通。两边都执行:
SELECT d.PLATFORM_NAME, tp.ENDIAN_FORMAT FROM v$database d, v$transportable_platform tp WHERE d.PLATFORM_NAME = tp.PLATFORM_NAME;
常见错误:
- 只查
v$database.platform_name,漏掉v$transportable_platform.endian_format - 把
Linux x86 64-bit和Linux x8664-bit当作同一平台(Oracle 内部命名不同,必须严格匹配查询结果) - 目标库版本太低,
v$transportable_platform缺失对应条目,查不到ENDIAN_FORMAT
如果两端 ENDIAN_FORMAT 不同(比如源是 Little,目标是 Big),就必须走 CONVERT TABLESPACE,不能跳过。
用 RMAN CONVERT TABLESPACE 翻转字节序
CONVERT DATABASE 在 11g 中不支持跨 endian,但 CONVERT TABLESPACE 支持——它会逐块翻转字节并重写文件头。
操作前必须:
- 在源库执行
ALTER TABLESPACE users READ ONLY,否则报ORA-19570 - 目标平台名必须严格匹配
v$transportable_platform输出,例如:'AIX-Based Systems (64-bit)',多一个空格或大小写错误都会失败 - 指定的输出路径(如
/tmp/converted/)需存在且 Oracle 用户有写权限,否则报ORA-19504
命令示例:
RMAN TARGET / CONVERT TABLESPACE users TO PLATFORM 'AIX-Based Systems (64-bit)' FORMAT '/tmp/converted/users_%U.dbf';
expdp 导出元数据时加 transport_full_check=y
RMAN 只转换数据文件,元数据还得靠 expdp。漏掉 transport_full_check=y,导出时不会发现隐式依赖(比如 PL/SQL 包体引用了其他表空间的对象),导致后续 impdp 失败或对象不可用。
关键点:
- 必须用
TRANSPORT_TABLESPACES=users指定表空间名,不是 schema 名 - 不能用
SCHEMAS=xxx替代,否则导出的是逻辑对象,不是 TTS 元数据 - 导出用户需有
EXP_FULL_DATABASE权限,否则报ORA-39165
示例命令:
expdp '/ as sysdba' \ DIRECTORY=data_pump_dir \ DUMPFILE=ts_meta.dmp \ TRANSPORT_TABLESPACES=users \ TRANSPORT_FULL_CHECK=Y
impdp 导入时必须手动指定 transport_datafiles 绝对路径
impdp 不会自动识别你复制过去的数据文件位置,必须显式告诉它:
-
TRANSPORT_DATAFILES参数值是**目标库上的绝对路径**,不是源库路径 - 路径要和你用
scp或其他方式复制过去的实际位置完全一致(包括大小写、斜杠方向) - 如果文件名含特殊字符或空格,整个路径要用双引号包裹
典型失败现象:
ORA-39123: Data Pump transportable tablespace job failed —— 很大概率是 transport_datafiles 路径不对或文件不存在;ORA-39142: incompatible version number —— 源目标库版本差太多(11.2.0.1 → 11.2.0.4 通常 OK,但跨 10g/11g 需额外验证)。
导入命令示例:
impdp '/ as sysdba' \ DIRECTORY=data_pump_dir \ DUMPFILE=ts_meta.dmp \ TRANSPORT_DATAFILES='/u01/app/oracle/oradata/prod/users01.dbf'字节序翻转和元数据绑定是两个独立动作,RMAN 转换完的文件不能直接扔进目标库 datafile 目录就完事——
impdp 必须看到它、认出它、且和 dump 文件里的校验信息对得上,缺一不可。











