oracle tts跨平台迁移必须确保源库与目标库的endian_format一致,否则impdp报ora-39123;需查v$transportable_platform而非v$database,且transport_full_check=y不可省略,transport_datafiles须用绝对路径。

Oracle的TTS跨平台迁移不是“直接拷过去就能用”,必须满足字节序(endian_format)一致,否则impdp会报ORA-39123或数据文件解析失败——这是最常被跳过的致命检查。
查源库和目标库的ENDIAN_FORMAT是否一致
跨平台≠任意平台互迁。Linux x86_64 和 AIX、HP-UX 之间不能直传,因为前者是Little Endian,后者是Big Endian。必须两边都查v$transportable_platform,不能只看v$database.platform_name。
- 两边分别执行:
SELECT platform_name, endian_format FROM v$transportable_platform WHERE platform_name = (SELECT platform_name FROM v$database); - 输出的
endian_format字段值必须完全相同(都是Little或都是Big) - 如果目标库查不到对应
platform_name条目(比如版本太低),v$transportable_platform里没这条记录,那TTS根本不可行,得换方案
确保表空间自包含且设为READ ONLY
DBMS_TTS.TRANSPORT_SET_CHECK只检查逻辑依赖,不保证物理可迁移。常见坑点:索引在A表空间、表在B表空间;函数索引依赖SYSAUX里的包;物化视图日志在别的表空间。
- 把所有待迁移的表空间一起检查:
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('TBS1,TBS2', TRUE, TRUE); - 立刻查
transport_set_violations视图,结果为空才安全 - 设
READ ONLY前确认业务已停写,否则应用立刻报ORA-01642 - 如果发现违反项(如外键指向
SYSTEM表空间),要么删约束、要么把关联对象一并加入迁移列表
expdp导出元数据时必须加transport_full_check=y
这个参数开启后,expdp会做比DBMS_TTS更严的扫描,覆盖PL/SQL包体引用、隐式依赖等。漏掉它,impdp可能中途失败,甚至导入成功但对象失效(比如包编译报错、索引不可用)。
- 导出命令示例:
expdp '/ as sysdba' transport_tablespaces=TBS1,TBS2 directory=dpump_dir dumpfile=tts_meta.dmp transport_full_check=y -
transport_full_check=y不能省,也不能写成transport_full_check=yes(只认y或n) - 导出只生成元数据dump,不碰数据文件——数据文件要你手动拷贝(或用
dbms_file_transfer)
目标库impdp前要手动复制数据文件并校验路径
impdp不会自动拉文件,它只认你指定的transport_datafiles路径。如果路径不对、权限不对、文件没拷全,直接报ORA-39123或ORA-19505。
- 拷完文件后,在目标库确认路径可读:
!ls -l /u01/oradata/mytbs01.dbf -
impdp命令中transport_datafiles必须写绝对路径,不能用变量或别名:transport_datafiles='/u01/oradata/mytbs01.dbf','/u01/oradata/mytbs02.dbf' - 如果目标库ASM存储,需先用
ASMCMD cp或RMAN CONVERT把文件转成ASM格式,再指定ASM路径 - 字符集不一致会静默失败(比如AL32UTF8 → ZHS16GBK),导入后中文变乱码,务必提前核对
NLS_CHARACTERSET
真正卡住人的地方,往往不是步骤记不住,而是ENDIAN_FORMAT没对齐、transport_full_check=y被忽略、或者transport_datafiles路径写错一个斜杠——这些错误不会在前期检查里暴露,要到impdp才炸,而且报错信息模糊。动手前,先把两边的v$transportable_platform和transport_set_violations截图存档,比反复重试快得多。











