数据泵是一套名为 expdp(Data Pump Export)和 impdp(Data Pump Import)的命令行工具,它的核心操作在数据库服务器端执行,这与传统的客户端工具 exp/imp 有本质区别。主要用途逻辑备份与恢复:备份数据库对象(表、模式、表空间甚至全库)并在需要时恢复,数据迁移:在不同平台、不同版本(通常支持向上兼容)的 Oracle 数据库之间移动数据。环境复制:将生产环境的数据复制到测试或开发环境。数据结构变更:在导入时方便地修改对象的属主(SCHEMA)、表空间(TABLESPACE)或存储参数。
一、数据导出(expdp)
1. 基础导出命令
expdp username/password@dbname DIRECTORY=pove_dir DUMPFILE=dump_data.dmp LOGFILE=dump_export.log2. 常用参数说明
案例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.log2. 常用参数说明
3. 使用场景
REMAP_SCHEMA:将对象从一个用户映射到另一个用户
impdp system/password@orcl DIRECTORY=dpump_dir DUMPFILE=sc_export.dmp REMAP_SCHEMA=sc:scottREMAP_TABLESPACE:将对象从一个表空间映射到另一个表空间
impdp system/password@orcl DIRECTORY=dpump_dir DUMPFILE=sc_export.dmp REMAP_TABLESPACE=tab:exampleTABLE_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=appendTRANSFORM:修改对象的存储子句,常用于去掉表空间设置
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;