oracle 11g跨平台表空间传输(tts)必须确保源库与目标库字节序(endian_format)完全一致,否则impdp报ora-39123等错误;需通过v$transportable_platform验证endian_format均为little或big,且表空间自包含、只读,expdp启用transport_full_check=y,impdp指定绝对路径的transport_datafiles并手动复制.dbf文件。
oracle 11g 中用 expdp 做跨平台表空间传输(tts)**不可直接跨平台**——必须先确认字节序(endian_format)一致,否则 impdp 会报 ora-39123 或底层数据文件解析失败。所谓“跨平台”仅指同 endian 的不同操作系统(如 linux x86_64 ↔ linux arm64),不是 hp-ux ↔ linux 这类大小端不兼容场景。
检查源库和目标库的 platform_name 与 endian_format 是否匹配
这是整个流程的前提,跳过这步等于提前埋雷。两边都执行:
SELECT d.PLATFORM_NAME, tp.ENDIAN_FORMAT FROM v$database d, v$transportable_platform tp WHERE d.PLATFORM_NAME = tp.PLATFORM_NAME;
输出结果中 ENDIAN_FORMAT 必须完全相同(都是 Little 或都是 Big)。常见误区:
- 只查
v$database.platform_name,忽略v$transportable_platform中的ENDIAN_FORMAT字段 - 误以为 “Linux x86_64” 和 “Linux x8664-bit” 是同一平台 —— 实际上后者是 Oracle 内部命名,需以查询结果为准
- 在目标库没创建对应
PLATFORM_NAME条目(比如目标库版本太低,v$transportable_platform缺失条目),导致查不到ENDIAN_FORMAT
确保表空间自包含且已设为 READ ONLY
DBMS_TTS.TRANSPORT_SET_CHECK 检查的是逻辑依赖,不是物理文件路径。即使所有对象都在一个表空间内,也可能因以下原因失败:
- 表上有函数索引,而函数体依赖
SYSAUX或其他表空间的对象 - 物化视图日志建在别的表空间(哪怕基表在待迁移表空间)
- 存在跨表空间的约束(如外键引用
SYSTEM表空间中的 lookup 表)
执行后务必查 TRANSPORT_SET_VIOLATIONS 视图,空结果才安全。设只读前确认业务已停写,否则应用会立刻收到 ORA-01642 错误。
expdp 导出元数据时 transport_full_check=y 不可省略
这个参数开启后,expdp 会在导出前做比 DBMS_TTS 更严格的依赖扫描(包括隐式依赖、PL/SQL 包体引用等)。漏掉它,impdp 可能中途失败,甚至导入成功但对象不可用(比如包编译失败、索引失效)。
命令示例(注意用户权限):
expdp '/ as sysdba' \ directory=DATA_PUMP_DIR \ dumpfile=tts_users.dmp \ logfile=tts_users.log \ transport_tablespaces=USERS \ transport_full_check=y
关键点:
-
directory必须在源库提前创建并授予权限(GRANT READ,WRITE ON DIRECTORY ...) -
dumpfile只含元数据,体积很小;真正耗时的是后续手动复制.dbf文件 - 不能用普通用户导出,除非该用户有
EXP_FULL_DATABASE角色
impdp 导入时 transport_datafiles 必须写绝对路径且目标文件不存在
impdp 不会自动创建数据文件,也不会覆盖已有文件。如果目标路径下 .dbf 已存在,会报 ORA-19721:Cannot locate datafile with absolute file number。
正确做法:
- 先用
scp或rsync把源库的.dbf文件复制到目标机器指定目录(如/u01/app/oracle/oradata/ORCL/users01.dbf) -
transport_datafiles参数值必须和目标文件实际路径完全一致(区分大小写、无空格、无软链) - 若目标库使用 ASM,路径要写成
+DATA/ORCL/DATAFILE/users.256.123456789格式,且需提前用ASMCMD cp或 RMAN 复制
导入命令示例:
impdp '/ as sysdba' \ dumpfile=tts_users.dmp \ directory=DATA_PUMP_DIR \ transport_datafiles='/u01/app/oracle/oradata/ORCL/users01.dbf' \ logfile=imp_tts.log
导入完成后别忘了 ALTER TABLESPACE USERS READ WRITE,否则应用仍无法写入。
最易被忽略的点:目标库的 db_block_size 虽然从 10g 起不要求和源库一致,但如果源库用了非标准块(比如 16K),而目标库没配置对应 DB_nK_CACHE_SIZE,impdp 会卡在数据文件头校验阶段,错误不明显,只表现为长时间无响应。











