数据泵是一套名为 expdp(Data Pump Export)和 impdp(Data Pump Import)的命令行工具,它的核心操作在数据库服务器端执行,这与传统的客户端工具 exp/imp 有本质区别。主要用途逻辑备份与恢复:备份数据库对象(表、模式、表空间甚至全库)并在需要时恢复,数据迁移:在不同平台、不同版本(通常支持向上兼容)的 Oracle 数据库之间移动数据。环境复制:将生产环境的数据复制到测试或开发环境。数据结构变更:在导入时方便地修改对象的属主(SCHEMA)、表空间(TABLESPACE)或存储参数。

特性

数据泵 (expdp/impdp)

传统工具 (exp/imp)

执行位置

服务器端

客户端

性能

极高。支持并行操作(PARALLEL),直接访问数据文件,网络流量小。

较低。单进程,数据流经客户端。

中断恢复

支持。作业在服务器端运行,可以暂停(STOP_JOB)、重启(START_JOB)或附加(ATTACH)到现有作业。

不支持。中断后必须重新开始。

精细控制

强大。可以精确包含或排除对象类型(如 exclude=table:"IN\('TEMP%'\)")、重映射数据(REMAP_DATA)、过滤数据(QUERY)。

有限。

依赖关系

自动处理。在导出和导入时能更好地处理对象之间的依赖关系(如索引、触发器、约束)。

处理能力较弱。

文件管理

使用目录对象(Directory Object),更安全,由DBA控制服务器文件访问路径。

使用客户端文件路径。

一、数据导出(expdp)

1. 基础导出命令

expdp username/password@dbname DIRECTORY=pove_dir DUMPFILE=dump_data.dmp LOGFILE=dump_export.log

2. 常用参数说明

案例1:依据SCHEMAS用户导出

expdp scott/acc261@orcl DIRECTORY=dpump_dir DUMPFILE=ucaq_schema.dmp SCHEMAS=scott

expdp scott/acc261@orcl DIRECTORY=dpump_dir DUMPFILE=exp_%U.dmp PARALLEL=4
---这将生成 exp_01.dmp, exp_02.dmp等文件

---可添加参数
TABLESPACES:---导出指定表空间中的所有表
FULL=Y:---导出整个数据库(需要 DATAPUMP_EXP_FULL_DATABASE 角色)
PARALLEL=n:---指定并行度,与 DUMPFILE 参数使用通配符配合效果最佳
COMPRESSION=ALL|DATA_ONLY|METADATA_ONLY|NONE:---压缩导出文件的内容,节省空间
EXCLUDE/INCLUDE:---排除或包含特定对象类型
 EXCLUDE=TABLE:"IN ('TEMP_TABLE', 'LOG_TABLE')"  ---排除特定表
 EXCLUDE=STATISTICS                           ---排除统计信息
 INCLUDE=TABLE                                ---仅包含表
ESTIMATE_ONLY=Y:---仅估算导出作业所需的磁盘空间,而不执行实际导出
CONTENT=ALL|DATA_ONLY|METADATA_ONLY:---指定导出内容(数据和元数据、仅数据、仅元数据)

案例2:导出特定的表

expdp scott/acc261@orcl DIRECTORY=dpump_dir DUMPFILE=ucaq_emp.dmp TABLES=emp
---导出表中早于2025-01-01 00:00:00的业务数据
expdp 'system/"ab2456df##**^^" '  
directory=data_pump_dir 
tables=scott.emp 
dumpfile=ucaq_emp.dmp 
logfile=ucaq_emp.log  
query=\"WHERE XGSJ \<= TO_DATE\(\'2025-01-01 00:00:00\',\'YYYY-MM-DD HH24:MI:SS\'\)\"
---query:带条件导出部分数据

案例3:只导出表结构而不包含数据

---导出全库
expdp lcy/lcy directory=DATA_PUMP_DIR dumpfile=TESTTABLE_kb.dmp content=metadata_only
---导出部份表
expdp lcy/lcy directory=DATA_PUMP_DIR dumpfile=TESTTABLE_kb.dmp TABLES=TESTTABLE content=metadata_only

案例4:使用脚本导出

#!/bin/sh
#刷新Oracle环境变量
source /home/oracle/.bash_profile

#SID
export ORACLE_SID=orcl

#备份目录名称
export ORACLE_DIRECTORY=DATA_PUMP_DIR

#备份目录
export DATA_DIR=/data/app/oracle/admin/orcl/dpdump

#删除备份时间 1 天
export DEL_TIME=`date -d "1 days ago" +%Y%m%d`

#备份时间
export BAKUP_TIME=`date +%Y%m%d%H%M%S`

#账号
export db_user=system

#密码
export db_password=fnxk8401##**

#db schemas
export db_schemas=US_SCOTT

#文件数据大小
export db_filesize=40G

#为导出数据的压缩级别
export db_compression=all

#为并行度,也就是定义dw进程的个数
#export db_parallel=4

#为RAC特有参数,定义作业是否在每个节点运行
#export db_cluster=no

mkdir -p $DATA_DIR

echo "-- $(date +':%Y%m%d%H%M%S') 自动备份数据库并压缩开始 " >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "------------------------------------------------------------------" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "-- $(date +'%Y%m%d%H%M%S') 开始备份的文件名:$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "Bakup file path $DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp"

expdp $db_user/$db_password schemas=$db_schemas directory=$ORACLE_DIRECTORY dumpfile=${ORACLE_SID}_${BAKUP_TIME}.dmp logfile=${ORACLE_SID}_${BAKUP_TIME}.log filesize=$db_filesize compression=$db_compression 

echo "-- $(date +'%Y%m%d%H%M%S') 备份成功:$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "------------------------------------------------------------------" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "-- $(date +'%Y%m%d%H%M%S') 开始进行压缩:$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp -> tar.gz" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

cd $DATA_DIR && tar -czvf ${ORACLE_SID}_${BAKUP_TIME}.tar.gz ${ORACLE_SID}_${BAKUP_TIME}.dmp ${ORACLE_SID}_${BAKUP_TIME}.log

echo "-- $(date +'%Y%m%d%H%M%S') 压缩成功:$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.tar.gz" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "------------------------------------------------------------------" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "-- $(date +'%Y%m%d%H%M%S') 开始删除1天前备份记录文件:$DATA_DIR/${ORACLE_SID}_${DEL_TIME}.tar.gz" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

rm -rf $DATA_DIR/${ORACLE_SID}_${DEL_TIME}*

echo "-- $(date +'%Y%m%d%H%M%S') 删除1天前备份记录文件:$DATA_DIR/${ORACLE_SID}_${DEL_TIME}.tar.gz 结束" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "------------------------------------------------------------------" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "-- $(date +'%Y%m%d%H%M%S') 开始删除当前备份记录文件:$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

rm -rf $DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp $DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.log

echo "-- $(date +'%Y%m%d%H%M%S') 删除当前备份记录文件$DATA_DIR/${ORACLE_SID}_${BAKUP_TIME}.dmp 成功" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "------------------------------------------------------------------" >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo "-- $(date +'%Y%m%d%H%M%S') 自动备份数据库并压缩完毕 " >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo " " >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

echo " " >> "$DATA_DIR/backlog/$(date +%Y-%m-%d).log";

二、数据导入(impdp)

1. 基础导入命令

impdp username/password@dbname DIRECTORY=import_dir DUMPFILE=import_data.dmp LOGFILE=import.log

2. 常用参数说明

参数名称

说明

ATTACH

把导入结果附加在一个已存在的导入作业中,默认为当前模式的唯一的导入作业

CONTENT

指定要导入的内容

DIRECTORY

指定转储文件和日志文件所在位置的目录对象,该对象由DBA预先创建

DUMPFILE

指定转储文件名称列表,可以包含目录对象名,默认值为expdat.dmp

EXCLUDE

指定导入操作中要排除的对象类型和对象定义

FULL

指定是否进行全数据库导入,包括所有数据和定义

INCLUDE

指定导入操作中要导入的对象类型和对象定义

JOB_NAME

指定导入作业的名称

LOGFILE

指定导入日志文件的名称

NOLOGFILE

指定是否生成导入日志文件

PARALLEL

指定执行导入作业时的并行进程最大个数

PARFILE

指定导入参数文件的名称

QUERY

指定导入操作中SELECT语句中的数据导入条件

REMAP_DATAFILE

将源数据文件名转换为目标数据文件名

REMAP_SCHEMA

将源模式中的所有对象导入到目标模式中

REMAP_TABLESPACE

将源表空间所有对象导入目标表空间中

REUSE_DATAFILES

指定是否使用创建表空间时已经存在的数据文件

SCHEMAS

指定进行模式导入及模式列表

SQLFILE

指定将导入操作中要执行的DDL语句写入在一个SQL脚本中

TABLES

指定表模式导入导入及表列表

TABLESPACES

指定进行表空间模式导入及表空间列表

TRANSFORM

指定是否修改创建对象的DDL语句

TRANSPORT_TABLESPACES

指定进行传输表空间模式导入及表空间列表

3. 使用场景

REMAP_SCHEMA:将对象从一个用户映射到另一个用户

impdp system/password@orcl DIRECTORY=dpump_dir DUMPFILE=sc_export.dmp REMAP_SCHEMA=sc:scott

REMAP_TABLESPACE:将对象从一个表空间映射到另一个表空间

impdp system/password@orcl DIRECTORY=dpump_dir DUMPFILE=sc_export.dmp REMAP_TABLESPACE=tab:example

TABLE_EXISTS_ACTION:当表已存在时的处理方式

  • SKIP:跳过该表(默认)。

  • APPEND:向现有表中追加数据。

  • TRUNCATE:截断现有表,然后插入数据。

  • REPLACE:删除现有表,然后重新创建并插入数据

impdp 'system/"45sfal13##**^^" ' DIRECTORY=data_pump_dir 
DUMPFILE=t_xksq_dwxx.dmp  TABLES=qaww.t_xksq_dwxx TABLE_EXISTS_ACTION=append

TRANSFORM:修改对象的存储子句,常用于去掉表空间设置

TRANSFORM=SEGMENT_ATTRIBUTES:N:table  # 不导入存储属性(如表空间、存储参数)

SQLFILE:将元数据(DDL语句)写入SQL文件,而不执行导入

SQLFILE=schema_ddl.sql

针对expdp案例3:只导出表结构而不包含数据使用impdp仅恢复表结构

---恢复全库
impdp lcy/lcy directory=DATA_PUMP_DIR dumpfile=TESTTABLE_kb.dmp content=metadata_only
---恢复某些表
impdp lcy/lcy directory=DATA_PUMP_DIR dumpfile=TESTTABLE_kb.dmp TABLES=TESTTABLE content=metadata_only

数据泵导出注意事项

1、如果表里本身不包含数据,也可以使用expdp和impdp导出表结构本身,Oracle11g开始新增一个参数【deferred_segment_creation】,该参数控制是不分配segment给新建的空表或者导入的空表,默认是true。

expdp song/song directory=DATA_PUMP_DIR dumpfile=t.dmp tables=test

impdp song/song directory=DATA_PUMP_DIR dumpfile=t.dmp

---可以使用sys用户登录查询SEGMENT
SELECT COUNT(*) FROM DBA_SEGMENTS WHERE SEGMENT_NAME='TEST' AND OWNER='SONG';

2、如果使用exp命令导出表里本身不包含数据的空表,可能会报如下错误

[oracle11g@ogg2 ~]$ exp song/song tables=test file=/ora11g/test.dmp

Export: Release 11.2.0.1.0 - Production on 星期二 5月 6 21:37:39 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即将导出指定的表通过常规路径...
EXP-00011: SONG.TEST 不存在
导出成功终止, 但出现警告。

解决办法可以使用insert语句插入只要插入就会带入segment或者可以直接插入segment,登录本地用户查询如下语句

select 'alter table' || table_name || 'allocate extent;' from user_tables where num_rows=0;
---将查询出来alter语句执行在使用exp导出就可以了
alter table tta allocate extent;