Oracle Data Pump(expdp/impdp)详解
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=******
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. 网络导入
6.1 Database Link
-- 创建 Database Link
CREATE PUBLIC DATABASE LINK src_link
CONNECT TO scott IDENTIFIED BY ******
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 ******
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. 最佳实践
- 生产用 Data Pump:替代 exp/imp
- 使用并行:大幅提升性能
- 压缩 dump:节省空间
- 加密敏感数据:ENCRYPTION
- 使用参数文件:复杂场景
- 监控任务:dba_datapump_jobs
- 合理 EXCLUDE:跳过统计信息等
- 网络导入:跨库迁移
- SQLFILE 生成 DDL:仅迁移结构
- 测试导入:验证 dump 有效性
14. 参考资料
[1] Oracle Database Utilities 19c, “Data Pump” https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump.html