Oracle TTS跨平台迁移前必须确认源目标库平台字节序一致,否则需RMAN转换;表空间须READ ONLY,禁用临时表等对象;EXPDP需用目录对象;IMPDP须显式指定或映射数据文件路径;字符集需兼容,否则运行时中文乱码。
Oracle TTS 导出前必须确认平台兼容性
跨平台传输表空间(tts)不是“导出再导入”就完事,第一步卡死在平台字节序(endian format)上。如果源库和目标库的 v$transportable_platform 中对应平台的 endian_format 不一致(比如 linux x86 64-bit 是 little endian,aix 是 big endian),就必须做 endian 转换,否则 impdp 直接报错 ora-19721:无法定位数据文件。
- 查源库平台:
SELECT platform_name, endian_format FROM v$transportable_platform WHERE platform_name = (SELECT platform_name FROM v$database); - 查目标库是否支持该平台:
SELECT platform_name, endian_format FROM v$transportable_platform; - 若两端 endian 不同,
CONVERT DATABASE或CONVERT TABLESPACE必须用 RMAN 执行,不能跳过 - 注意:Windows 和 Linux x86_64 通常都是 Little Endian,可直传;但 Solaris SPARC、HP-UX、AIX 就很可能要转换
使用 EXPDP 生成 TTS 元数据时的三个硬约束
导出本身不搬数据文件,只导出表空间定义、对象元数据和约束信息,但有三个条件不满足,EXPDP 会直接失败或导致后续导入报 ORA-39123 / ORA-39142。
- 表空间必须为
READ ONLY:执行ALTER TABLESPACE users READ ONLY;,不是“建议”,是强制要求 - 不能含全局临时表、物化视图日志、外部表、BFILE 列——这些对象会导致
EXPDP报ORA-39123并中止 -
DUMPFILE参数不能写相对路径,必须用 Data Pump directory 对象(如DATA_PUMP_DIR),且目录需提前创建并授予权限:GRANT READ, WRITE ON DIRECTORY data_pump_dir TO system;
典型命令:expdp system/password transport_tablespaces=users directory=data_pump_dir dumpfile=tts_users.dmp logfile=exp_tts.log
导入时 IMPDP 报 ORA-39142 或找不到数据文件的处理逻辑
这个错误表面是“版本不兼容”或“文件不存在”,实际往往因为元数据与物理文件没对齐。导入不是自动猜路径,它严格依赖导出时记录的绝对路径,而你几乎肯定要改。
- 用
TRANSPORT_DATAFILES显式指定目标端的数据文件路径,例如:impdp system/password directory=data_pump_dir dumpfile=tts_users.dmp transport_datafiles='/u01/oradata/mydb/users01.dbf' - 如果源库路径很长(如
/oracle/db11g/oradata/…),目标端又不想建一模一样的目录结构,就加REMAP_DATAFILE参数映射:remap_datafile='/old/path/users01.dbf':'/u01/oradata/mydb/users01.dbf' - 导入用户必须有
IMP_FULL_DATABASE角色,且目标库中不能已存在同名表空间(除非加TABLESPACE参数指定新名字) - 导入后别忘了把表空间设回
READ WRITE:ALTER TABLESPACE users READ WRITE;
字符集和 NLS_TERRITORY 不匹配引发的隐性问题
表空间迁移不校验字符集,但一旦源库是 AL32UTF8、目标库是 ZHS16GBK,哪怕导入成功,查询中文字段也可能乱码或报 ORA-12704。这不是 TTS 流程报错,而是运行时才暴露。
- 检查源库字符集:
SELECT property_value FROM database_properties WHERE property_name = 'NLS_CHARACTERSET'; - 目标库必须是源库字符集的超集(如 AL32UTF8 → ZHS16GBK 不行,ZHS16GBK → AL32UTF8 可以),否则
CREATE DATABASE阶段就要重做 -
NLS_TERRITORY和NLS_LANGUAGE不影响导入动作,但会影响默认排序规则(NLS_SORT)、日期格式等,应用连接时若未显式设置,可能行为突变
最稳妥的做法:迁移前用 DBMS_METADATA.GET_DDL 抽一份关键对象 DDL,人工比对字符集相关定义,别全信“导入成功”四个字。










