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

徐万新之路

