跳到主要内容

Oracle数据泵(Data Pump)简明使用指南

📦 数据泵是什么?

Oracle数据泵(Data Pump) 是 Oracle 10g 及以后版本提供的高速数据迁移工具,用于替代传统的 exp/imp 工具。它支持并行处理、断点续传、网络传输等高级功能。


🎯 核心特点

特点说明
高速支持并行导出/导入,比传统 exp/imp 快很多
灵活支持表、用户、表空间、全库等不同级别
可控可监控、暂停、重启、调整并行度
网络模式支持数据库间直接传输(无需中间文件)
过滤功能可排除/包含特定对象类型或数据

🔧 基本使用步骤

1. 创建目录对象(必需)

-- 1. 创建操作系统目录(在服务器上)
mkdir -p /u01/dpump_dir

-- 2. 创建Oracle目录对象
CREATE OR REPLACE DIRECTORY dpump_dir AS '/u01/dpump_dir';

-- 3. 授予用户权限
GRANT READ, WRITE ON DIRECTORY dpump_dir TO scott;

2. 数据泵导出(expdp)

常用导出模式:

# 1. 按用户导出
expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott_%U.dmp
LOGFILE=scott_exp.log SCHEMAS=scott PARALLEL=4

# 2. 按表导出
expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=tables.dmp
TABLES=emp,dept

# 3. 全库导出(需要DBA权限)
expdp system/password DIRECTORY=dpump_dir DUMPFILE=full_%U.dmp
FULL=Y LOGFILE=full_exp.log

# 4. 按表空间导出
expdp system/password DIRECTORY=dpump_dir DUMPFILE=tbs.dmp
TRANSPORT_TABLESPACES=users

实用参数:

# 压缩(减少文件大小)
COMPRESSION=ALL

# 仅导出元结构(不含数据)
CONTENT=METADATA_ONLY

# 仅导出数据(表必须已存在)
CONTENT=DATA_ONLY

# 排除特定对象
EXCLUDE=INDEX:"LIKE 'EMP%'"

# 包含特定对象
INCLUDE=TABLE:"IN ('EMP', 'DEPT')"

# 导出时不记录日志
FLASHBACK_TIME="TO_TIMESTAMP('2023-11-21 10:00:00','YYYY-MM-DD HH24:MI:SS')"

# 估算导出大小(不实际导出)
ESTIMATE_ONLY=Y

3. 数据泵导入(impdp)

常用导入模式:

# 1. 按用户导入
impdp system/password DIRECTORY=dpump_dir DUMPFILE=scott_%U.dmp
LOGFILE=scott_imp.log SCHEMAS=scott

# 2. 从scott用户导入到新用户new_scott
impdp system/password DIRECTORY=dpump_dir DUMPFILE=scott.dmp
REMAP_SCHEMA=scott:new_scott

# 3. 从A表空间导入到B表空间
impdp system/password DIRECTORY=dpump_dir DUMPFILE=scott.dmp
REMAP_TABLESPACE=users:users_new

# 4. 全库导入
impdp system/password DIRECTORY=dpump_dir DUMPFILE=full.dmp
FULL=Y LOGFILE=full_imp.log

# 5. 仅导入表结构(不导数据)
impdp system/password DIRECTORY=dpump_dir DUMPFILE=scott.dmp
SQLFILE=create_tables.sql -- 生成DDL语句

实用参数:

# 改变表空间
REMAP_TABLESPACE=old_tbs:new_tbs

# 改变数据文件位置
REMAP_DATAFILE='/old/path/system01.dbf':'/new/path/system01.dbf'

# 导入时跳过已存在对象
TABLE_EXISTS_ACTION=SKIP # 或 REPLACE、APPEND、TRUNCATE

# 仅导入元结构
CONTENT=METADATA_ONLY

# 导入时排除特定对象
EXCLUDE=CONSTRAINT,REF_CONSTRAINT

# 并行导入(提升速度)
PARALLEL=4

🚀 高级功能

1. 网络模式(无需生成DMP文件)

# 直接从源库传输到目标库
impdp system/password@target_db DIRECTORY=dpump_dir
NETWORK_LINK=source_db_link SCHEMAS=scott

需要先创建数据库链接:

CREATE DATABASE LINK source_db_link 
CONNECT TO scott IDENTIFIED BY tiger
USING 'source_db_tns';

2. 作业控制

# 查看数据泵作业
SELECT * FROM DBA_DATAPUMP_JOBS;

# 交互式命令(在导出/导入时按Ctrl+C进入)
expdp> STATUS # 查看状态
expdp> STOP_JOB=IMMEDIATE # 立即停止作业
expdp> START_JOB # 重启作业
expdp> PARALLEL=8 # 动态调整并行度
expdp> KILL_JOB # 终止作业

3. 过滤和转换

# 只导出特定条件的表数据
expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp_data.dmp
TABLES=emp QUERY=emp:"WHERE deptno=10"

# 导入时重命名表
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp
REMAP_TABLE=emp:employees_new

# 导入时过滤数据
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp
TABLES=emp QUERY=emp:"WHERE sal > 3000"

📋 常用场景示例

场景1:迁移用户数据

# 1. 导出用户数据
expdp system/password DIRECTORY=dpump_dir DUMPFILE=hr_%U.dmp
SCHEMAS=hr LOGFILE=hr_exp.log PARALLEL=4
COMPRESSION=ALL

# 2. 在目标库创建用户
CREATE USER hr IDENTIFIED BY hr DEFAULT TABLESPACE users;

# 3. 导入用户数据
impdp system/password DIRECTORY=dpump_dir DUMPFILE=hr_%U.dmp
SCHEMAS=hr LOGFILE=hr_imp.log REMAP_TABLESPACE=users:users_new

场景2:克隆生产库到测试库

# 1. 导出生产库
expdp system/prod_password DIRECTORY=dpump_dir
DUMPFILE=prod_clone_%U.dmp FULL=Y PARALLEL=8
COMPRESSION=ALL EXCLUDE=STATISTICS

# 2. 在测试库创建必要目录
CREATE OR REPLACE DIRECTORY dpump_dir AS '/u01/dpump_dir';

# 3. 导入到测试库,并修改表空间
impdp system/test_password DIRECTORY=dpump_dir
DUMPFILE=prod_clone_%U.dmp FULL=Y
REMAP_TABLESPACE=prod_data:test_data,prod_index:test_index

场景3:定期备份表结构

# 每周日备份表结构
expdp system/password DIRECTORY=dpump_dir
DUMPFILE=schema_backup_%d.dmp -- %d为星期几
CONTENT=METADATA_ONLY SCHEMAS=app_user
LOGFILE=schema_backup.log

⚠️ 注意事项

1. 版本兼容性

  • 高版本导出的数据不能直接导入低版本
  • 使用 VERSION 参数指定兼容版本:
    expdp ... VERSION=11.2  # 导出为11.2兼容格式

2. 空间需求

  • 导出文件通常为源数据大小的 1/3 到 1/2(使用压缩时)
  • 确保目录有足够空间:df -h /u01/dpump_dir

3. 字符集问题

-- 确保源库和目标库字符集一致
SELECT * FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER LIKE '%CHARACTERSET';

4. 权限需求

  • 导出:需要 EXP_FULL_DATABASE 角色
  • 导入:需要 IMP_FULL_DATABASE 角色

🔍 监控和调试

-- 查看数据泵作业状态
SELECT * FROM DBA_DATAPUMP_JOBS;
SELECT * FROM DBA_DATAPUMP_SESSIONS;

-- 查看详细日志
SELECT * FROM TABLE(
DBMS_DATAPUMP.GET_STATUS(
'SYS_IMPORT_FULL_01', -- 作业名
NULL, NULL, 'ALL')
);

-- 查看导出/导入进度
SELECT sid, serial#, opname, sofar, totalwork,
ROUND(sofar/totalwork*100,2) "% Complete"
FROM v$session_longops
WHERE opname LIKE 'Data Pump%'
AND totalwork != 0;

💎 快速参考命令

操作命令示例
导出用户expdp scott/tiger SCHEMAS=scott DUMPFILE=scott.dmp
导入用户impdp system/password SCHEMAS=scott DUMPFILE=scott.dmp
导出表expdp scott/tiger TABLES=emp,dept DUMPFILE=tables.dmp
全库导出expdp system/password FULL=Y DUMPFILE=full.dmp
网络导入impdp system/password NETWORK_LINK=dblink SCHEMAS=scott
改变用户impdp ... REMAP_SCHEMA=scott:new_scott
改变表空间impdp ... REMAP_TABLESPACE=users:new_users
并行处理PARALLEL=4 DUMPFILE=exp_%U.dmp

常用文件命名通配符:

  • %U:自动生成01-99的序列号(用于并行)
  • %d:星期几(1-7)
  • %D:月份中的第几天
  • %T:年月日(YYYYMMDD)
  • %h:小时(HH24)

📊 性能优化建议

  1. 使用并行处理PARALLEL=CPU核数×2
  2. 开启压缩COMPRESSION=ALL(CPU换空间)
  3. 多文件并行I/ODUMPFILE=exp_%U.dmp FILESIZE=2G
  4. 调整缓冲区BUFFER=10240000(10MB)
  5. 关闭日志NOLOGFILE=Y(仅用于测试)
  6. 网络模式优先:避免文件I/O瓶颈

简单记住:数据泵 = expdp(导出) + impdp(导入)+ 目录对象 + 并行处理。它比传统exp/imp快得多,功能也更强大!