Oracle Data Pump(expdp/impdp)详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai
文档版本:v1.0 / 2026-07


1. 概述

Oracle Data Pump 是 10g 引入的高性能数据导出/导入工具[1],替代传统的 exp/imp:

核心特性:

  • 高性能:并行处理,Direct Path
  • 灵活:表/模式/表空间/全库
  • 可重启:任务可暂停/恢复
  • 支持网络:直接导入/导出
  • 监控:DBA_DATAPUMP_JOBS

2. Data Pump vs exp/imp

维度 exp/imp Data Pump
性能 低 高(10-100 倍)
并行 不支持 支持
重启 不支持 支持
监控 不支持 支持
网络 不支持 支持
版本 7.3+ 10g+
位置 客户端 服务端

3. 目录对象

3.1 创建 Directory

-- 创建目录对象
CREATE DIRECTORY dpump_dir AS '/u01/dpump';

-- 授权
GRANT READ, WRITE ON DIRECTORY dpump_dir TO scott;

-- 查看目录
SELECT * FROM dba_directories WHERE directory_name='DPUMP_DIR';

3.2 默认目录

-- 默认 DATA_PUMP_DIR
SELECT directory_path FROM dba_directories WHERE directory_name='DATA_PUMP_DIR';

4. 导出(expdp)

4.1 表模式

# 导出单表
expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp TABLES=employees

# 导出多表
expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp TABLES=employees,departments,jobs

# 带查询条件
expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp TABLES=employees \
  QUERY=employees:"WHERE dept_id = 10"

4.2 模式模式

# 导出 scott 模式
expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp SCHEMAS=scott

# 导出多模式
expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=multi.dmp SCHEMAS=scott,hr,sales

4.3 表空间模式

expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=ts.dmp TABLESPACES=users,example

4.4 全库导出

expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=full.dmp FULL=Y

4.5 并行导出

# 并行导出
expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=full_%U.dmp FULL=Y PARALLEL=4

# %U 自动生成 01, 02, ...
# full_01.dmp, full_02.dmp, full_03.dmp, full_04.dmp

4.6 压缩

# 压缩
expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=full.dmp FULL=Y COMPRESSION=ALL

# COMPRESSION 选项:
# ALL: 元数据+数据
# DATA_ONLY: 仅数据
# METADATA_ONLY: 仅元数据
# NONE: 不压缩

4.7 加密

# 加密
expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=enc.dmp FULL=Y \
  ENCRYPTION=ALL ENCRYPTION_PASSWORD=pwd123

4.8 估算大小

# 估算导出大小(不实际导出)
expdp system/pwd DIRECTORY=dpump_dir ESTIMATE_ONLY=Y SCHEMAS=scott

5. 导入(impdp)

5.1 表导入

# 导入表
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp TABLES=employees

# 重命名表
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp TABLES=employees \
  REMAP_TABLE=employees:employees_new

5.2 模式导入

# 导入模式
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp SCHEMAS=scott

# 重映射模式
impdp system/pwd DIRECTORY=dpump_dir DUMPFILE=scott.dmp \
  REMAP_SCHEMA=scott:new_scott

5.3 表空间重映射

impdp system/pwd DIRECTORY=dpump_dir DUMPFILE=scott.dmp \
  REMAP_TABLESPACE=users:new_users

5.4 表空间导入

impdp system/pwd DIRECTORY=dpump_dir DUMPFILE=ts.dmp TABLESPACES=users

5.5 全库导入

impdp system/pwd DIRECTORY=dpump_dir DUMPFILE=full.dmp FULL=Y

5.6 跳过对象

# 跳过特定对象
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp \
  EXCLUDE=TABLE:"IN ('employees')"

# 仅包含特定对象
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp \
  INCLUDE=TABLE:"LIKE 'EMP%'"

5.7 数据加载方式

# Direct Path(默认)
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp TABLES=employees \
  TABLE_EXISTS_ACTION=REPLACE

# External Table 方式
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp TABLES=employees \
  ACCESS_METHOD=EXTERNAL_TABLE

# TABLE_EXISTS_ACTION 选项:
# SKIP: 跳过
# APPEND: 追加
# TRUNCATE: 清空后导入
# REPLACE: 替换

6. 网络导入

-- 创建 Database Link
CREATE PUBLIC DATABASE LINK src_link 
  CONNECT TO scott IDENTIFIED BY tiger 
  USING 'src_db';

6.2 网络导入

# 从源库直接导入到目标库(无需 dump 文件)
impdp scott/tiger DIRECTORY=dpump_dir NETWORK_LINK=src_link \
  TABLES=employees REMAP_TABLE=employees:employees_new

6.3 网络导出

# 从源库导出到目标库的 dump 文件
expdp system/pwd DIRECTORY=dpump_dir NETWORK_LINK=src_link \
  SCHEMAS=hr DUMPFILE=hr.dmp

7. 任务管理

7.1 启动任务

# 后台启动
expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=full.dmp FULL=Y JOB_NAME=full_export

7.2 查看任务

SELECT 
  owner_name, 
  job_name, 
  operation, 
  job_mode, 
  state, 
  degree, 
  attached_sessions
FROM dba_datapump_jobs;

7.3 暂停/恢复

# 暂停
expdp system/pwd ATTACH=full_export
Import> STOP_JOB=IMMEDIATE

# 恢复
expdp system/pwd ATTACH=full_export
Import> START_JOB

# 重启
expdp system/pwd ATTACH=full_export
Import> START_JOB=SKIP_CURRENT

7.4 终止任务

expdp system/pwd ATTACH=full_export
Import> KILL_JOB

7.5 监控进度

-- 进度
SELECT 
  job_name, 
  operation, 
  state,
  percent_done
FROM dba_datapump_jobs;

-- 详细
SELECT 
  sid, 
  serial#, 
  opname, 
  target, 
  sofar, 
  totalwork, 
  units,
  time_remaining
FROM v$session_longops
WHERE opname LIKE '%Data Pump%';

8. 参数文件

8.1 创建参数文件

# expdp.par
DIRECTORY=dpump_dir
DUMPFILE=scott_%U.dmp
SCHEMAS=scott
PARALLEL=4
LOGFILE=scott.log
COMPRESSION=ALL
EXCLUDE=STATISTICS

8.2 使用参数文件

expdp system/pwd PARFILE=expdp.par

9. 常用参数

9.1 导出参数

参数 说明
DIRECTORY 目录对象
DUMPFILE dump 文件名
LOGFILE 日志文件
TABLES 表列表
SCHEMAS 模式列表
TABLESPACES 表空间列表
FULL 全库
PARALLEL 并行度
COMPRESSION 压缩
ENCRYPTION 加密
EXCLUDE 排除对象
INCLUDE 包含对象
QUERY 查询条件
CONTENT 内容(ALL/DATA_ONLY/METADATA_ONLY)
ESTIMATE_ONLY 仅估算
JOB_NAME 任务名
VERSION 版本兼容

9.2 导入参数

参数 说明
REMAP_SCHEMA 重映射模式
REMAP_TABLE 重映射表
REMAP_TABLESPACE 重映射表空间
REMAP_DATAFILE 重映射数据文件
TABLE_EXISTS_ACTION 表存在时操作
SQLFILE 生成 SQL 文件(不导入)
TRANSFORM 转换对象属性

10. TRANSFORM 选项

10.1 常用转换

# 不导入存储属性(使用默认)
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp \
  TRANSFORM=STORAGE:N

# 不导入段属性
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp \
  TRANSFORM=SEGMENT_ATTRIBUTES:N

# 指定表空间
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp \
  TRANSFORM=SEGMENT_ATTRIBUTES:N:TABLE

# OID 转换
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp \
  TRANSFORM=OID:N

11. SQLFILE 生成

11.1 生成 SQL 而非导入

impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp \
  SQLFILE=scott_ddl.sql

11.2 查看 DDL

# 查看生成的 SQL
cat /u01/dpump/scott_ddl.sql

12. 常见坑与排错

12.1 ORA-39002: 无效操作

修复:

# 1. 检查目录对象
SELECT * FROM dba_directories WHERE directory_name='DPUMP_DIR';

# 2. 检查权限
GRANT READ, WRITE ON DIRECTORY dpump_dir TO scott;

# 3. 检查物理路径
ls -ld /u01/dpump

12.2 ORA-39070: 无法打开日志文件

修复:

# 1. 检查 OS 目录
mkdir -p /u01/dpump
chown oracle:dba /u01/dpump
chmod 775 /u01/dpump

# 2. 检查 Directory 对象指向的路径

12.3 ORA-39125: KUPW worker 错误

修复:

# 1. 检查 dump 文件完整性
# 2. 重新生成 dump
# 3. 使用 EXCLUDE 排除问题对象
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp \
  EXCLUDE=STATISTICS

12.4 ORA-31626: 任务不存在

修复:

-- 1. 清理 Data Pump 任务表
EXEC DBMS_DATAPUMP.STOP_JOB('JOB_NAME');

-- 2. 清理 master 表
DROP TABLE system.<job_name>;

12.5 性能慢

修复:

# 1. 启用并行
expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=full_%U.dmp FULL=Y PARALLEL=8

# 2. 使用 Direct Path
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp ACCESS_METHOD=DIRECT_PATH

# 3. 增大 SGA / PGA

12.6 表空间不足

修复:

-- 1. 检查表空间
SELECT tablespace_name, free_mb FROM dba_tablespace_usage_metrics;

-- 2. 添加数据文件
ALTER TABLESPACE users ADD DATAFILE '/u01/oradata/users02.dbf' SIZE 10G;

-- 3. 或重映射表空间
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp REMAP_TABLESPACE=users:big_ts

13. 最佳实践

  1. 生产用 Data Pump:替代 exp/imp
  2. 使用并行:大幅提升性能
  3. 压缩 dump:节省空间
  4. 加密敏感数据:ENCRYPTION
  5. 使用参数文件:复杂场景
  6. 监控任务:dba_datapump_jobs
  7. 合理 EXCLUDE:跳过统计信息等
  8. 网络导入:跨库迁移
  9. SQLFILE 生成 DDL:仅迁移结构
  10. 测试导入:验证 dump 有效性

14. 参考资料

[1] Oracle Database Utilities 19c, “Data Pump”
https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump.html