expdp的tablespaces参数仅支持逗号分隔的表空间名列表(如tablespaces=users,example),不可含空格或通配符;必须确保目录对象已创建、用户有读写权限,且避开system、sysaux等系统表空间,否则报错或跳过。
直接用 tablespaces 参数就能导出指定表空间,但必须确保目录对象存在、用户有权限、且目标表空间不是系统关键空间(如 system、sysaux)。
expdp 的 tablespaces 参数怎么写才有效
这个参数只接受表空间名称列表,不支持通配符或正则表达式。多个表空间用英文逗号分隔,中间不能有空格:
expdp system/password@orcl \ directory=DATA_PUMP_DIR \ dumpfile=tbs_export.dmp \ tablespaces=USERS,EXAMPLE \ logfile=tbs_export.log
注意:directory 必须是数据库中已创建的目录对象(DBA_DIRECTORIES 可查),不是操作系统路径;dumpfile 名称里不能含路径,否则报错 ORA-39001: invalid argument value。
哪些表空间不能用 tablespaces 导出
以下情况会直接失败或跳过:
-
SYSTEM、SYSAUX、UNDO、TEMP这类系统管理表空间,即使加了tablespaces也会被忽略,expdp 会报ORA-39126: Worker unexpected fatal error in KUPW$WORKER.GET_TABLE_DATA_OBJECTS类似错误 - 只读表空间(
READ ONLY)可以导出,但导入时需确保目标库也支持该状态,否则 impdp 报ORA-39083: Object type TABLESPACE failed to create - 离线表空间(
OFFLINE)无法导出,expdp 会提示ORA-01157: cannot identify/lock data file
导出时要不要加 parallel 和 compression
对大表空间导出,这两个参数影响明显:
-
parallel=4能显著提升速度,但并行度不能超过 CPU 核数 × 1.5,否则 I/O 瓶颈反而更严重 -
compression=ALL或compression=DATA_ONLY可减少 30%~60% 文件体积,但会增加 CPU 消耗;Oracle 12c+ 才支持compression=ALL,旧版本只能用GZIP(需额外许可) - 如果导出后要跨平台迁移(比如 Linux → Windows),建议关闭压缩,避免 impdp 解压失败
导出后如何验证内容是否完整
别只看日志末尾有没有 Job "SYSTEM"."SYS_EXPORT_TABLESPACE_01" successfully completed —— 那只是作业结束,不代表数据全:
- 检查日志中是否有
ORA-39171: Job is experiencing a resumable wait,这类等待常因磁盘满或 quota 超限导致部分对象跳过 - 用
impdp ... sqlfile=check.sql include=table_data把元数据抽成 SQL,确认表名、行数、约束是否匹配源库DBA_SEGMENTS和DBA_TABLES - 特别注意分区表:如果表空间里有分区表,而某些分区落在别的表空间,那些分区不会被导出,
tablespaces不做跨空间拉取
最容易被忽略的是:导出时没检查表空间是否包含 LOB 段且 LOB 表空间不在列表里——这种情况下,LOB 数据会丢失,但 expdp 默认不报错,只在日志里埋一句 Warning: Data for LOB column ... will not be exported,藏得非常深。











