迄今为止导出/导入工具集仍是跨多个平台转移数据所需劳动强度最小的首选实用工具尽管人们常常抱怨它速度太慢导入只是将每条记录从导出转储文件中读出来然后使用常见的 INSERT INTO 命令将其插入到目标表中因此导入可能是个很慢的过程这一点并不让人感到吃惊
进入 Oracle Data PumpOracle Database g 中的导出/导入工具包的更新更快的同类工具它被设计来成倍地加速这个过程
Data Pump 反映了整个导出/导入过程的彻底革新它不是使用常见的 SQL 命令而是应用专用 API 来以更快得多的速度加载和卸载数据在我的测试中我看到导出性能比在直接模式下提高了 倍导入过程性能提高了 倍此外与使用导出实用工具不同它还能够只取出特定类型的对象(如过程)
Data Pump 导出
这个新的实用工具称为 expdp以和原来的导出 exp 区分开在本例中我们将用 Data Pump 来导出一个大表 CASES大小约为 GBData Pump 在服务器端使用文件处理来创建和读取文件因此目录作为位置使用在这种情况下我们将使用文件系统 /u/dpdata 来保存转储文件
create directory dpdata as /u/dpdata;grant read write on directory dpdata to ananda;
接下来我们将导出数据
expdp ananda/abc tables=CASES directory=DPDATA dumpfile=expCASESdmp job_name=CASES_EXPORT
让我们来分析该命令的各个部分用户 ID/口令组合表和转储文件参数的意义是显而易见的与原来的导出不同文件是在服务器(不是客户端)上创建的位置由目录参数值 DPDATA 指定它指向之前创建的 /u/dpdata这个进程还在目录参数指定的位置上创建一个日志文件(同样在服务器上)默认地这个进程使用一个名称为 DPUMP_DIR 的目录因此可以创建它来代替 DPDATA
注意上面的参数 job_name这是个特殊的参数在原来的导出中没有所有的 Data Pump 工作都通过作业来完成Data Pump 作业 — 与 DBMS 作业不同 — 只是服务器进程它代表主进程处理数据主进程(称为主控制进程)通过高级队列 (AQ) 来协调这项工作它通过在运行期内创建的一个特殊的表(称为主表)来实现这个目的在我们的例子中如果您在 expdp 运行时检查用户 ANANDA 的模式 您将注意到一个表 CASES_EXPORT 的存在(对应参数 job_name)当 expdp 结束时这个表被丢弃
导出监控
当 Data Pump Export (DPE) 运行时按 ControlC它将阻止消息在屏幕上显示但不停止导出进程本身相反它将显示 DPE 提示符(如下所示)进程现在被认为处于交互式模式
Export>
这种方法允许在这个 DPE 作业上输入几条命令要查看概要在提示符下使用 STATUS 命令
Export> statusJob:CASES_EXPORTOperation:EXPORT Mode:TABLEState:EXECUTINGDegree: Job Error Count: Dump file:/u/dpdata/expCASESdmp bytes written =Worker Status:StateEXECUTINGObject Schema:DWOWNERObject Name:CASESObject Type:TABLE_EXPORT/TBL_TABLE_DATA/TABLE/TABLE_DATACompleted Objects: Total Objects: Completed Rows:
记住这只是状态显示导出在后台工作要继续在屏幕上查看消息从 Export> 提示符下使用命令 CONTINUE_CLIENT
并行操作
您可以通过 PARALLEL 参数为导出使用一个以上的线程来显着地加速作业每个线程创建一个单独的转储文件因此参数 dumpfile 应当拥有和并行度一样多的项目您可以指定通配符作为文件名而不是显式地输入各个文件名例如
expdp ananda/abc tables=CASES directory=DPDATA dumpfile=expCASES_%Udmp parallel= job_name=Cases_Export
注意 dumpfile 参数拥有一个通配符 %U它指示文件将按需要创建格式将为 expCASES_nndmp其中 nn 从 开始然后按需要向上增加
在并行模式下状态屏幕将显示四个工作进程(在默认模式下只有一个进程是可见的)所有的工作进程同步取出数据并在状态屏幕上显示它们的进度
分离访问数据文件和转储目录文件系统的输入/输出通道是很重要的否则与维护 Data Pump 作业相关的开销可能超过并行线程的效益并因此而降低性能并行方式只有在表的数量多于并行值并且表很大时才是有效的
数据库监控
您还可以从数据库视图获得关于运行的 Data Pump 作业的更多信息监控作业的主视图是 DBA_DATAPUMP_JOBS它将告诉您在作业上有多少个工作进程(列 DEGREE)在工作另一个重要的视图是 DBA_DATAPUMP_SESSIONS当它与上述视图和 V$SESSION 结合时将给出主前台进程的会话 SID
select sid serial#from v$session s dba_datapump_sessions dwhere ssaddr = dsaddr;
这条指令显示前台进程的会话更多有用的信息可以从警报日志中获得当进程启动时MCP 和工作进程在警报日志中显示如下
kupprdp:master process DM started with pid= OS id= to execute SYSKUPM$MCPMAIN(CASES_EXPORT ANANDA);kupprdp:worker process DW started with worker id= pid= OS id= to execute SYSKUPW$WORKERMAIN(CASES_EXPORT ANANDA);kupprdp:worker process DW started with worker id= pid= OS id= to execute SYSKUPW$WORKERMAIN(CASES_EXPORT ANANDA);
它显示为数据泵操作启动的会话的 PID您可以用以下查询找到实际的 SID
select sid program from v$session where paddr in (select addr from v$process where pid in ());
PROGRAM 列将对应警报日志文件中的名称显示进程 DM (为主进程)或 DW (为工作进程)如果一个工作进程使用了并行查询比如说 SID 您可以在视图 V$PX_SESSION 中看到它并把它找出来它将为您显示从 SID 代表的工作进程中运行的所有并行查询会话
select sid from v$px_session where qcsid = ;
从视图 V$SESSION_LONGOPS 中可以获得其它的有用信息来预测完成作业将花费的时间
select sid serial# sofar totalworkfrom v$session_longopswhere opname = CASES_EXPORTand sofar != totalwork;
列 totalwork 显示总工作量该列的 sofar 数量被加和到当前的时刻 — 因而您可以用它来估计还要花多长时间
Data Pump 导入
不过数据导入性能是 Data Pump 真正出色的地方要导入先前导出的数据我们将使用
impdp ananda/abc directory=dpdata dumpfile=expCASESdmp job_name=cases_import
导入进程的默认行为是创建表和所有相关的对象然后在表已存在时产生一个错误如果您想把数据添加到一个现有的表中您可以在上述命令行中使用 TABLE_EXISTS_ACTION=APPEND
和使用 Data Pump 导入一样在进程中按 ControlC 将进入 Date Pump Import (DPI) 的交互模式同样提示符是 Import>
处理特定对象
您是否有过只需要从一个用户导出特定的过程以在一个不同的数据库或用户中重新创建这些过程的情况?与传统的导出实用工具不同Data Pump 允许您只导出特定类型的对象例如以下命令让您只导出过程而不导出其它任何东西 — 不导出表视图甚至函数
expdp ananda/iclaim directory=DPDATA dumpfile=expprocsdmp include=PROCEDURE
要只导出一些特定的对象 — 比如说函数 FUNC 和过程 PROC — 您可以使用
expdp ananda/iclaim directory=DPDATA dumpfile=expprocsdmp include=PROCEDURE:\=\PROC\\FUNCTION:\=\FUNC\\
这个转储文件充当了源对象的一个备份您甚至可以用它来创建 DDL 脚本以供之后使用一个称为 SQLFILE 的特殊参数允许创建 DDL 脚本文件
impdp ananda/iclaim directory=DPDATA dumpfile=expprocsdmp sqlfile=procssql
该指令在 DPDATA 指定的目录中创建一个名称为 procssql 的文件并将对象的脚本包含在导出转储文件中这种方法帮助您快速地在另一个模式中创建源对象
利用参数 INCLUDE 允许您从转储文件中定义要包含或排除的对象您可以使用子句 INCLUDE=TABLE:LIKE TAB% 来仅导出那些名称以 TAB 开头的表类似地您可以使用结构 INCLUDE=TABLE:NOT LIKE TAB% 来排除所有名称以 TAB 开头的表作为另一种选择您可以使用 EXCLUDE 参数来排除特定的对象
通过外部表Data Pump 还可以用来传输表空间它非常强大能够即时地重定义并行方式将更多的表添加到一个现有的进程中等等