transport_tablespaces仅导出元数据且要求表空间read only;须确认表空间状态、对象完整性、字符集兼容性及directory权限,并搭配dumpfile、logfile和directory使用。
expdp transport_tablespaces 导出前必须确认的 4 件事
直接说结论:transport_tablespaces 不导出表数据,只导出元数据(ddl + 对象定义),且要求表空间已设为 read only。跳过任一检查,导出会失败或产生不可用的 dump 文件。
-
SELECT tablespace_name, status FROM dba_tablespaces确认目标表空间状态是READ ONLY—— 这不是可选步骤,是硬性前提;READ WRITE表空间会报错ORA-39123: Data Pump transportable tablespace job aborted - 检查所有相关对象是否都在该表空间内:
SELECT owner, segment_name, segment_type FROM dba_segments WHERE tablespace_name = 'YOUR_TBS',漏掉一个索引或 LOB 段,导入时就会报ORA-39186: Unable to transport tablespace - 确认数据库字符集与目标库兼容,尤其当含 CLOB/NCHAR 列时:
SELECT parameter, value FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');不一致会导致导入时报ORA-39126: Worker unexpected fatal error - 确保
DIRECTORY对象存在且用户有READ、WRITE权限:GRANT READ, WRITE ON DIRECTORY dpump_dir TO your_user;权限不足时错误信息是ORA-39002: invalid operation,但根本原因藏在日志里
TRANSPORT_TABLESPACES 参数必须搭配的 3 个关键选项
单独写 TRANSPORT_TABLESPACES=USERS 会报错——它从来不是独立参数,必须和 DUMPFILE、LOGFILE、DIRECTORY 组合使用,且不能带 CONTENT=DATA_ONLY 或 EXCLUDE=TABLE_DATA 这类冲突选项。
-
DUMPFILE必须指定,且文件名不能含路径(路径由DIRECTORY控制):正确写法是DUMPFILE=tts_export.dmp,不是DUMPFILE=/path/to/tts_export.dmp -
LOGFILE强烈建议显式指定,否则日志默认写入DIRECTORY对应 OS 路径下,容易找不到:LOGFILE=tts_export.log - 不能加
SCHEMAS或INCLUDE=TABLE——TRANSPORT_TABLESPACES是按表空间粒度操作的,混用对象级参数会触发ORA-39157: invalid mode for transportable tablespace export
导出后拿到的 DMP 文件里到底有什么
别被“导出”二字误导:这个 DMP 文件不含任何行数据,只包含能让目标库重建对象结构的元数据,比如 CREATE TABLE、CREATE INDEX、约束定义、授权语句,以及表空间/数据文件的映射关系。
- 可用
impdp加SQLFILE参数预览内容:impdp system/password SQLFILE=tts_ddl.sql DUMPFILE=tts_export.dmp DIRECTORY=dpump_dir TRANSPORT_DATAFILES='/u01/oradata/db/users01.dbf'—— 输出的是纯 SQL,没数据 - 如果源库表空间仍是
READ ONLY,导出的 DMP 中会记录DATAFILE的绝对路径;导入时若路径不一致,需用REMAP_DATAFILE显式重映射,否则报ORA-19721: Cannot find datafile - 导出速度极快,和表空间大小无关,只取决于对象数量;10TB 表空间和 10MB 表空间导出耗时几乎一样
常见报错和对应排查动作
多数失败不是语法问题,而是环境状态没对齐。看到报错先别改命令,先查状态。
-
ORA-39123: Data Pump transportable tablespace job aborted→ 立即查dba_tablespaces,90% 是表空间没设成READ ONLY,剩下 10% 是用了加密表空间(不支持传输) -
ORA-39186: Unable to transport tablespace→ 执行SELECT * FROM dba_transportable_platform确认源/目标平台是否在白名单中(如 Linux x86 64-bit 和 Windows IA 64 不互通) -
ORA-39002: invalid operation→ 检查DIRECTORY对象是否存在、权限是否完整、OS 层目录是否真实可写;ls -ld看目录权限,id看 Oracle 进程用户
最易被忽略的一点:导出完成后,表空间可以立刻切回 READ WRITE,但导入端必须提前准备好空闲的 DATAFILE 路径,且不能依赖自动扩展——TRANSPORT_DATAFILES 指定的文件必须已存在、大小匹配,否则导入直接失败。










