正德厚生,臻于至善

Oracle数据泵(expdp/impdp)完整使用指南

Oracle Data Pump(数据泵)是Oracle 10g及后续版本中引入的高性能数据迁移工具,其设计旨在替代传统的exp和imp工具。其核心架构、组件与概念构建了一个高效、可扩展且具备故障恢复能力的数据传输与处理引擎。

一、核心架构与组件

Data Pump的架构采用客户端/服务器模型,通过数据库作业控制和并行处理机制实现数据的高速移动。主要组件包括:

1、客户端工具 (Client Utilities)

  • expdp (Data Pump Export):数据导出客户端。
  • impdp (Data Pump Import):数据导入客户端。
  • 功能:负责解析用户命令、建立与数据库的连接、生成并提交Data Pump作业请求。客户端本身不执行实际的数据读写操作,任务提交后即可断开连接,作业在服务器端继续运行。

2、数据库内核服务器进程 (DBMS_DATAPUMP PL/SQL Package & Server Processes)

  • 主进程 (Master Process – DMnn):每个Data Pump作业都有一个主进程(DMnn)。它是作业的控制中心,负责创建和控制作业、维护作业状态(存储在Master Table中)、与客户端通信以及协调工作进程。
  • 工作进程 (Worker Process – DWnn):由主进程启动,负责执行实际的数据加载和卸载任务。可以启动多个工作进程以实现并行操作,显著提升吞吐量。工作进程的数量可通过PARALLEL参数指定。
  • 并行查询进程 (Parallel Query Processes – Pnnn):当启用并行执行时,工作进程会协调这些并行查询进程来加速表数据的扫描或加载。

3、主控表 (Master Table)

  • 这是Data Pump架构中的关键概念。它是一个特殊的数据库表,在作业开始时由主进程创建在作业发起用户的schema中。
  • 它完整记录了作业的元数据(如作业状态、要处理的对象列表、依赖关系、当前进度、错误信息等)。在导出作业中,主控表会先被写入dump文件;在导入时,则从dump文件中读取以指导导入过程。作业成功完成后,主控表默认被删除。

4、转储文件集与日志文件 (Dump File Set & Log File)

  • 转储文件集:由一个或多个操作系统文件组成,存储导出的数据、元数据和主控表。文件存储在由DIRECTORY对象指定的操作系统目录中。
  • 日志文件:记录作业执行的详细过程、状态信息和错误报告。

二、核心工作流程

一个典型的Data Pump导出/导入作业遵循以下步骤:

1、作业初始化:客户端(expdp/impdp)连接到数据库,调用DBMS_DATAPUMP包API创建作业,并指定参数(如模式、表、并行度等)。

2、主进程与主控表创建:数据库服务器启动主进程(DMnn),并在用户schema中创建主控表,用以跟踪作业。

3、工作进程分配与任务执行:主进程根据PARALLEL参数启动一个或多个工作进程(DWnn)。工作进程从数据字典或dump文件中读取元数据,并执行实际的SQL语句来提取或插入数据。

  • 导出时:工作进程读取数据库中的数据块,将其转换为Data Pump专有格式,并写入转储文件。
  • 导入时:工作进程从转储文件中读取数据和元数据,在目标数据库中重建对象并加载数据。

4、状态监控与交互:主进程持续更新主控表。客户端可以随时附加到正在运行的作业(使用ATTACH参数)来监控状态、修改并行度或停止作业。

5、作业完成与清理:所有任务完成后,主进程更新主控表状态为COMPLETED。对于导出作业,主控表内容被写入转储文件;对于导入作业,主控表从转储文件读取并在作业结束时删除。最后,主进程和工作进程终止。

三、关键技术特性与概念

1、并行处理 (Parallelism):通过PARALLEL参数控制,允许多个工作进程同时处理不同部分的数据(如表分区、大表的分块),这是其高性能的核心。

2、网络模式 (Network Mode):允许在不生成中间转储文件的情况下,直接在两个数据库之间传输数据(使用NETWORK_LINK参数),极大地简化了同构数据库间的迁移。

3、重映射与转换 (Remapping and Transformation):在导入时,可以使用REMAP_SCHEMA, REMAP_TABLE, REMAP_DATA等参数灵活地改变对象属性和数据内容,适应目标环境。

4、细粒度对象选择与过滤:支持通过INCLUDE和EXCLUDE参数精确控制哪些对象类型或特定对象被处理,提供了极高的操作灵活性。

5、可恢复性与附加操作:作业状态持久化在主控表中,因此作业可以暂停(STOP_JOB)、恢复(START_JOB)或由新的客户端连接附加(ATTACH)进行交互式管理。

6、压缩与加密:支持在导出时对元数据、表数据或整个dump文件进行压缩(COMPRESSION),以及对敏感数据进行加密(ENCRYPTION),以节省空间并保障安全。

四、示例

1)前置准备工作

1、创建操作系统目录(用于存储导入/导出文件)

[root@test02 ~]# mkdir -p /data/dump

[root@test02 ~]# chown -R oracle:oinstall /data/dump/

[root@test02 ~]# chmod 755 /data/dump/

注意:

  • 在Oracle中创建DIRECTORY对象(必须)
  • Data Pump要求使用Oracle Directory对象,不能直接使用OS路径

2、数据库中创建目录对象并授权

[root@test02 ~]# su – oracle

[oracle@test02 ~]$ sqlplus / as sysdba

sys@TEST02 13:51:50> create directory data_dump_dir as ‘/data/dump’;

sys@TEST02 17:01:28> grant read,write on directory data_pump_dir to bingo;   –授予目标用户权限

sys@TEST02 17:06:12> select * from dba_directories where directory_name=’DATA_DUMP_DIR’;

注意:

    目录对象指向的目录路径必须位于数据库服务器上。此外,OS用户oracle必须拥有该目录的读写权限。最后,还应为执行数据泵操作的用户授予读写目录对象的权限。

2)EXPDP概述

  • 替代旧版exp工具,性能更高,功能更强。
  • 支持并行、压缩、加密、过滤、重映射等。
  • 导出文件为.dmp(二进制) + 可选日志文件(.log)

expdp命令语法:

expdp username/password@tns_alias DIRECTORY=dir_name DUMPFILE=file.dmp LOGFILE=file.log

注意:

1.DIRECTORY必须是Oracle中已定义的DIRECTORY对象名(非OS路径)

2.如果密码含特殊字符,在 Linux 下需要对引号进行转义 \”。

例如:[oracle@test02 ~]$ expdp bingo/\”a@123\” directory=DATA_DUMP_DIR tables=dept dumpfile=dept_`date +%Y_%m_%d_%H%M`.dmp logfile=dept_`date +%Y_%m_%d_%H%M`.log

3.如果没有设置DUMPFILE文件的名称,数据泵会创建一个expdat.dmp的文件。如果该目录中已经存在expdat.dmp文件,数据泵就会报错。

  如果没有指定LOGFILE日志文件的名称,数据泵会创建一个export.log的日志文件。如果该文件已经存在export.log文件,数据泵就会覆盖该日志文件。

1、全库导出

[oracle@test02 ~]$expdp system/password FULL=y directory=data_dump_dir dumpfile=full_db_%U_`date +%Y_%m_%d_%H%M`.dump logfile=full_db_`date +%Y_%m_%d_%H%M`.log parallel=4

全库导出的时候,如果某些表没权限的时候会失败,可以在导出的语句中加入as sysdba

例如:

expdp \’sys/password as sysdba\’

expdp \’sys/password as sysdba\’ full=y directory=data_dump_dir dumpfile=full_db_%U_`date +%Y_%m_%d_%H%M`.dmp logfile=full_db_export.log  parallel=6

full=y:导出整个数据库(需要DBA权限或datapump_exp_full_database角色的用户)

%U:自动分卷(如full_db_01.dump,full_db_02.dmp)

parallel=4:启用4个并行进程

注意:

全库导出不会导出数据库中的所有元素。

1.sys方案中的对象不会导出(也有一些例外,如AUD$表)

2.不会导出索引数据,更确切地说,不会导出用于重建索引的索引DDL代码。

2、按用户导出(按schema导出)

[oracle@test02 ~]$expdp system/password schemas=bingo directory=data_dump_dir dumpfile=bingo_`date +%Y_%m_%d_%H%M`.dmp logfile=bingo_export_`date +%Y_%m_%d_%H%M`.log compression=all parallel=6

schemas=bingo:仅导出bingo该用户所有对象

compression=all:压缩元数据和数据

3、按表导出

[oracle@test02 ~]$expdp system/password tables=bingo.dept,bingo.bonus directory=data_dump_dir dumpfile=dept_`date +%Y_%m_%d_%H%M`.dmp logfile=dept_exprot_`date +%Y_%m_%d_%H%M`.log

4、仅导出指定数据

[oracle@test02 ~]$expdp system/passowrd schemas=scott content=metadata_only directory=data_dump_dir dumpfile=scott_meta.dmp logfile=scott_meta_export.log   –导出scott架构下的元数据

[oracle@test02 ~]$expdp system/passowrd full=y content=metadata_only include=tablespace directory=DATA_DUMP_DIR dumpfile=tabspc_`date +%Y_%m_%d_%HH%MM`.dmp logfile=tabpsc_`date +%Y_%m_%d_%HH%MM`.log   –导出表空间元数据

content=metadata_only:只导出表结构、索引、约束等,不导出数据

5、排除特定对象

[oracle@test02 ~]$expdp system/passowrd schemas=scott exclude=index,statistics,constraint directory=data_dump_dir dumpfile=scott_no_index.dmp logfile=scott_no_index_export.log   –排除索引、统计信息、约束

[oracle@test02 ~]$expdp system/passowrd directory=DATA_DUMP_DIR tables=dept,emp exclude=index:\”like \’PK%\’\” dumpfile=dept_`date +%Y_%m_%d_%H%M`.dmp logfile=dept_`date +%Y_%m_%d_%H%M`.log  –排除主键索引

exclude=index,statistics,constraint:排除索引、统计信息、约束等。

6、按表空间导出

[oracle@test02 ~]$expdp system/password tablespaces=users directory=data_dump_dir dumpfile=users_`date +%Y_%m_%d_%H%M`.dmp logfile=users_exprot_`date +%Y_%m_%d_%H%M`.log 

7、带QUERY导出

[oracle@test02 ~]$expdp system/password directory=DATA_DUMP_DIR tables=dept,emp query=dept:\”where deptno=50\” query=emp:\”where ename=\’ALLEN\’\” dumpfile=dept_`date +%Y_%m_%d_%H%M`.dmp logfile=dept_`date +%Y_%m_%d_%H%M`.log

8、按百分比导出数据

[oracle@test02 ~]$expdp system/password directory=DATA_DUMP_DIR tables=dept,emp sample=dept:10 dumpfile=dept_`date +%Y_%m_%d_%H%M`.dmp logfile=dept_`date +%Y_%m_%d_%H%M`.log   –导出两个表,dept仅导出10%的数据

expdp system/password directory=DATA_DUMP_DIR tables=dept sample=50 dumpfile=dept_`date +%Y_%m_%d_%H%M`.dmp logfile=dept_`date +%Y_%m_%d_%H%M`.log   –导出表中50%的数据

9、估算导出作业文件大小

[oracle@test02 ~]$expdp system/password estimate_only=y full=y logfile=n  –估算全库导出文件的大小

[oracle@test02 ~]$expdp system/password estimate_only=y schemas=scott logfile=n     –估算用户导出文件的大小

10、创建一致的导出文件

  • 一致的导出文件是指,导出文件中的所有数据都具有一致的时间或SCN。

select current_scn from v$database;    –查询当前数据库的SCN值

[oracle@test02 ~]$expdp system/password directory=DATA_DUMP_DIR full=y flashback_scn=30776689 dumpfile=full_db_`date +%Y_%m_%d_%H%M`.dmp logfile=dept_`date +%Y_%m_%d_%H%M`.log   –导出指定SCN一致文件

[oracle@test02 ~]$expdp system/password directory=DATA_DUMP_DIR full=y flashback_time=\”to_timestamp\(\’2026-4-29 16:00:00\’,\’yyyy-mm-dd hh24:mi:ss\’\)\” dumpfile=full_db_`date +%Y_%m_%d_%H%M`.dmp logfile=dept_`date +%Y_%m_%d_%H%M`.log  –导出指定时间一致的文件

注意:

在执行导出操作时,无法同时设置flashback_scn和flashback_scn参数,这两个参数向后排斥。

同时使用它们,会出现下面的错误:

ORA-39050: parameter FLASHBACK_TIME is incompatible with parameter FLASHBACK_SCN

11、使用参数文件

[oracle@test02 ~]$vi expdp.par

userid=system/password

directory=data_dump_dir

dumpfile=dept.dmp

logfile=dept_exprot.log

tables=bingo.dept

reuse_dumpfiles=y

[oracle@test02 dump]$ expdp parfile=expdp.par

3)IMPDP概述

  • 与expdp配套使用,用于导入.dmp文件
  • 支持重命名、跳过错误、转换字符集

IMPDP语法:

impdp username/password directory=dir_name dumpfile=file.dmp logfile=import.log

1、全库导入(需谨慎)

[oracle@test02 ~]$impdp system/password full=y directory=data_dump_dir dumpfile=full_db.dmp logfile=full_import.log

注意:

1.导入整个数据库需要DBA权限或datapump_imp_full_database角色的用户

2.通常用于新建库重建,生产慎用

执行全库导入操作时需要注意下列几点:

1.导入作业会先尝试重建所有表空间。如果表空间已经存在,或表空间依存的目录路径不存在,那么创建表空间的操作就会失败,导入作业会执行下一个任务。

2.导入作业会更改sys和system用户账号,使它们包含导出的密码。因此,对于系统执行全库导入操作后,为谨慎起见,应为新环境更改密码。

3.导入作业会创建导出文件中的所有用户。如果某个用户已经存在,系统就会显示错误提示,而导入作业会执行下一个任务。

4.从数据库导出的用户会使用原来的密码。可以根据自己的安全标准,更改这些密码。

5.表会被重建。如果表已经存在并含有数据,必须设置导入作业处理该情况的方法。可以设置导入作业跳过、替换或截断该表,也可以设置将数据附加到该表中。

6.当所有表都重建完并加载数据后,导入作业会创建相关索引。

7.在能够获得统计数据的情况下,导入作业还会导入统计数据。而且,导入作业还会实例化对象的权限。

2、导入不同用户

[oracle@test02 ~]$impdp system/password directory=data_dump_dir dumpfile=scott.dmp remap_schema=scott:bingo logfile=remap_import.log

[oracle@test02 ~]$impdp system/password directory=data_dump_dir dumpfile=scott.dmp remap_schema=scott:bingo content=metadata_only logfile=remap_import.log   –仅导入元数据

remap_schema=scott:bingo:将Scott的对象导入到bingo用户下

在执行方案级导入操作时,需要注意下列几点:

1.方案级导出文件中不含有表空间。

2.导入作业会重建数据泵文件含有的所有用户。如果用户已经存在,系统会显示错误提示,而导入作业会继续执行下一个任务。

3.导入作业会通过数据泵文件重置用户的密码。

4.用户拥有的表会被导出并加载数据。如果表已经存在,则必须使用table_exists_action参数设置数据泵处理该情况的方法。

在使用全库导出数据泵文件时,也可以执行方案级导入操作。要做到这一点,可以设置从全库导出文件提取哪个用户。

[oracle@test02 ~]$impdp system/password directory=data_dump_dir dumpfile=full_db.dmp schemas=bingo,scott logfile=full_import.log

3、表存在时跳过或替换

[oracle@test02 ~]$impdp system/password directory=data_dump_dir dumpfile=scott_meta.dmp table_exists_action=replace logfile=replace_import.log

table_exists_action取值:

  • skip:不使用content=data_only参数情况下的默认值,表示跳过已存在表
  • append:使用content=data_only参数情况下的默认值,表示追加数据
  • truncate:清空表后插入
  • replace:删除表重建

[oracle@test02 ~]$impdp system/password directory=data_dump_dir dumpfile=scott_meta.dmp table_exists_action=append  content=data_only logfile=replace_import.log   –不创建对象,仅导入数据

content参数取值:

  • data_only
  • all(默认值)
  • metadata_only

在使用全库导出或方案级导出数据泵文件时,也可以执行表级导入操作。要做到这一点,应设置全库导出或方案级导出数据泵文件提取哪些表。

[oracle@test02 ~]$impdp system/password directory=data_dump_dir dumpfile=full_db.dmp schemas=bingo.dept logfile=full_import.log

4、仅导入元数据

[oracle@test02 ~]$impdp system/passowrd directory=data_dump_dir dumpfile=scott_meta.dmp remap_schema=scott:bingo content=metadata_only logfile=data_import.log

5、并行导入(加速大库导入速度)

[oracle@test02 ~]$impdp system/password  full=y directory=data_dump_dir dumpile=full_db_%U.dmp parallel=4 logfile=parallel_import.log

6、导入指定表空间

[oracle@test02 ~]$impdp system/password   directory=data_dump_dir dumpile=tabsp.dmp logfile=tabsp.log

使用全库导出文件执行表空间级导入操作。

[oracle@test02 ~]$impdp system/password tablespaces=users directory=data_dump_dir dumpfile=full_db.dmp  logfile=users_import.log

表空间级导入操作会创建表空间含有的所有表和索引,该操作不会重建表空间本身。

7、从导入文件中排除对象

[oracle@test02 ~]$impdp  system/password directory=DATA_DUMP_DIR dumpfile=dept.dmp exclude=trigger,procedure  –排除触发器和存储过程

8、导入内容中指定包含对象

[oracle@test02 ~]$impdp system/password directory=DATA_DUMP_DIR dumpfile=dept.dmp include=table:\”like ‘A%\’\”    –只导入A开头的表

9、列出数据泵文件的内容

[oracle@test02 ~]$impdb system/password directory=data_dump_dir dumpfile=dept.dmp sqlfile=data_dump_dir:expdept.sql

当在导入操作中使用SQLPFILE选项时,impdp进程不会导入任何数据;它仅会创建含有导入进程运行的SQL命令的文件。有时候生成SQL文件可能更方便:

1.在运行导入操作前预览并验证SQL语句。

2.手动运行SQL命令,重建数据库对象。

3.捕捉用于重建数据库对象(用户、表、索引等)的SQL代码。

10、导入完后清理无效对象

sys@TEST02 19:20:00> @?/rdbms/admin/utlrp.sql

赞(0) 打赏
未经允许不得转载:徐万新之路 » Oracle数据泵(expdp/impdp)完整使用指南

支持快讯、专题、百度收录推送、人机验证、多级分类筛选器,适用于垂直站点、科技博客、个人站,扁平化设计、简洁白色、超多功能配置、会员中心、直达链接、文章图片弹窗、自动缩略图等...

联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册