您当前的位置: 首页 > 数据库教程 > Oracle教程 > 教你怎样在Oracle数据库中高速导出/导入

教你怎样在Oracle数据库中高速导出/导入

作者:guanchaofeng 来源:本站整理 发布时间: 2009-08-24 14:58 点击:
迄今为止,导出/导入工具集仍是跨多个平台转移数据所需劳动强度最小的首选实用工具,尽管人们常常抱怨它速度太慢。导入只是将每条记录从导出转储文件中读出来,然后使用常见的INSERTINTO命令将其插入到目标表中,因此导入可能是个很慢的过程,这一点并不让人

教你怎样在Oracle数据库中高速导出/导入

  迄今为止,导出/导入工具集仍是跨多个平台转移数据所需劳动强度最小的首选实用工具,尽管人们常常抱怨它速度太慢。导入只是将每条记录从导出转储文件中读出来,然后使用常见的INSERTINTO命令将其插入到目标表中,因此导入可能是个很慢的过程,这一点并不让人感到吃惊。
  
  进入OracleDataPump,OracleDatabase10g中的导出/导入工具包的更新更快的同类工具,它被设计来成倍地加速这个过程。
  
  DataPump反映了整个导出/导入过程的彻底革新。它不是使用常见的SQL命令,而是应用专用API来以更快得多的速度加载和卸载数据。在我的测试中,我看到导出性能比在直接模式下提高了10-15倍,导入过程性能提高了5倍。此外,与使用导出实用工具不同,它还能够只取出特定类型的对象(如过程)。
  
  DataPump导出
  
  这个新的实用工具称为expdp,以和原来的导出exp区分开。在本例中,我们将用DataPump来导出一个大表CASES,大小约为3GB。DataPump在服务器端使用文件处理来创建和读取文件;因此,目录作为位置使用。在这种情况下,我们将使用文件系统/u02/dpdata1来保存转储文件。
  
  createdirectorydpdata1as'/u02/dpdata1';
  
  grantread,writeondirectorydpdata1toananda;
  
  接下来,我们将导出数据:
  
  expdpananda/abc123tables=CASESdirectory=DPDATA1
  
  dumpfile=expCASES.dmpjob_name=CASES_EXPORT
  
  让我们来分析该命令的各个部分。用户ID/口令组合、表和转储文件参数的意义是显而易见的。与原来的导出不同,文件是在服务器(不是客户端)上创建的。位置由目录参数值DPDATA1指定,它指向之前创建的/u02/dpdata1。这个进程还在目录参数指定的位置上创建一个日志文件(同样在服务器上)。默认地,这个进程使用一个名称为DPUMP_DIR的目录;因此可以创建它来代替DPDATA1。
  
  注意上面的参数job_name,这是个特殊的参数,在原来的导出中没有。所有的DataPump工作都通过作业来完成。DataPump作业—与DBMS作业不同—只是服务器进程,它代表主进程处理数据。主进程(称为主控制进程)通过高级队列(AQ)来协调这项工作;它通过在运行期内创建的一个特殊的表(称为主表)来实现这个目的。在我们的例子中,如果您在expdp运行时检查用户ANANDA的模式,您将注意到一个表CASES_EXPORT的存在(对应参数job_name)。当expdp结束时,这个表被丢弃。
  
  导出监控
  
  当DataPumpExport(DPE)运行时,按Control-C;它将阻止消息在屏幕上显示,但不停止导出进程本身。相反,它将显示DPE提示符(如下所示)。进程现在被认为处于“交互式”模式:
  
  Export>
  
  这种方法允许在这个DPE作业上输入几条命令。要查看概要,在提示符下使用STATUS命令:
  
  Export>status
  
  Job:CASES_EXPORT
  
  Operation:EXPORT
  
  Mode:TABLE
  
  State:EXECUTING
  
  Degree:1
  
  JobErrorCount:0
  
  Dumpfile:/u02/dpdata1/expCASES.dmp
  
  byteswritten=2048
  
  Worker1Status:
  
  State:EXECUTING
  
  ObjectSchema:DWOWNER
  
  ObjectName:CASES
  
  ObjectType:TABLE_EXPORT/TBL_TABLE_DATA/TABLE/TABLE_DATA
  
  CompletedObjects:1
  
  TotalObjects:1
  
  CompletedRows:4687818
  
  记住,这只是状态显示。导出在后台工作。要继续在屏幕上查看消息,从Export>提示符下使用命令CONTINUE_CLIENT。
  
  并行操作
  
  您可以通过PARALLEL参数为导出使用一个以上的线程来显著地加速作业。每个线程创建一个单独的转储文件,因此参数dumpfile应当拥有和并行度一样多的项目。您可以指定通配符作为文件名,而不是显式地输入各个文件名,例如:
  
  expdpananda/abc123tables=CASESdirectory=DPDATA1
  
  dumpfile=expCASES_%U.dmpparallel=4job_name=Cases_Export
  
  注意dumpfile参数拥有一个通配符%U,它指示文件将按需要创建,格式将为expCASES_nn.dmp,其中nn从01开始,然后按需要向上增加。
  
  在并行模式下,状态屏幕将显示四个工作进程。(在默认模式下,只有一个进程是可见的。)所有的工作进程同步取出数据,并在状态屏幕上显示它们的进度。
  
  分离访问数据文件和转储目录文件系统的输入/输出通道是很重要的。否则,与维护DataPump作业相关的开销可能超过并行线程的效益,并因此而降低性能。并行方式只有在表的数量多于并行值并且表很大时才是有效的。
  
  数据库监控
  
  您还可以从数据库视图获得关于运行的DataPump作业的更多信息。监控作业的主视图是DBA_DATAPUMP_JOBS,它将告诉您在作业上有多少个工作进程(列DEGREE)在工作。另一个重要的视图是DBA_DATAPUMP_SESSIONS,当它与上述视图和V$SESSION结合时将给出主前台进程的会话SID。
  
  selectsid,serial#
  
  fromv$sessions,dba_datapump_sessionsd
  
  wheres.saddr=d.saddr;
  
  这条指令显示前台进程的会话。更多有用的信息可以从警报日志中获得。当进程启动时,MCP和工作进程在警报日志中显示如下:
  
  kupprdp:masterprocessDM00startedwithpid=23,
  
  OSid=20530toexecute-
  
  SYS.KUPM$MCP.MAIN('CASES_EXPORT','ANANDA');
  
  kupprdp:workerprocessDW01startedwithworker
  
  id=1,pid=24,OSid=20532toexecute-
  
  SYS.KUPW$WORKER.MAIN('CASES_EXPORT','ANANDA');
  
  kupprdp:workerprocessDW03startedwithworker
  
  id=2,pid=25,OSid=20534toexecute-
  
  SYS.KUPW$WORKER.MAIN('CASES_EXPORT','ANANDA');
  
  它显示为数据泵操作启动的会话的PID。您可以用以下查询找到实际的SID:
  
  selectsid,programfromv$sessionwherepaddrin
  
  (selectaddrfromv$processwherepidin(23,24,25));
  
  PROGRAM列将对应警报日志文件中的名称显示进程DM(为主进程)或DW(为工作进程)。如果一个工作进程使用了并行查询,比如说SID23,您可以在视图V$PX_SESSION中看到它,并把它找出来。它将为您显示从SID23代表的工作进程中运行的所有并行查询会话:
  
  selectsidfromv$px_sessionwhereqcsid=23;
  
  从视图V$SESSION_LONGOPS中可以获得其它的有用信息来预测完成作业将花费的时间。
  
  selectsid,serial#,sofar,totalwork
  
  fromv$session_longops
  
  whereopname='CASES_EXPORT'
  
  andsofar!=totalwork;
  
  列totalwork显示总工作量,该列的sofar数量被加和到当前的时刻—因而您可以用它来估计还要花多长时间。
  
  DataPump导入
  
  不过,数据导入性能是DataPump真正出色的地方。要导入先前导出的数据,我们将使用
  
  impdpananda/abc123directory=dpdata1
  
  dumpfile=expCASES.dmpjob_name=cases_import
  
  导入进程的默认行为是创建表和所有相关的对象,然后在表已存在时产生一个错误。如果您想把数据添加到一个现有的表中,您可以在上述命令行中使用TABLE_EXISTS_ACTION=APPEND。
  
  和使用DataPump导入一样,在进程中按Control-C将进入DatePumpImport(DPI)的交互模式;同样,提示符是Import>。
  
  处理特定对象
  
  您是否有过只需要从一个用户导出特定的过程,以在一个不同的数据库或用户中重新创建这些过程的情况?与传统的导出实用工具不同,DataPump允许您只导出特定类型的对象。例如,以下命令让您只导出过程,而不导出其它任何东西—不导出表、视图、甚至函数:
  
  expdpananda/iclaimdirectory=DPDATA1
  
  dumpfile=expprocs.dmpinclude=PROCEDURE
  
  要只导出一些特定的对象—比如说,函数FUNC1和过程PROC1—您可以使用
  
  expdpananda/iclaimdirectory=DPDATA1dumpfile=expprocs.dmp
  
  include=PROCEDURE:\"=\'PROC1\'\",FUNCTION:\"=\'FUNC1\'\"
  
  这个转储文件充当了源对象的一个备份。您甚至可以用它来创建DDL脚本,以供之后使用。一个称为SQLFILE的特殊参数允许创建DDL脚本文件。
  
  impdpananda/iclaimdirectory=DPDATA1
  
  dumpfile=expprocs.dmpsqlfile=procs.sql
  
  该指令在DPDATA1指定的目录中创建一个名称为procs.sql的文件,并将对象的脚本包含在导出转储文件中。这种方法帮助您快速地在另一个模式中创建源对象。
  
  利用参数INCLUDE允许您从转储文件中定义要包含或排除的对象。您可以使用子句INCLUDE=TABLE:"LIKE'TAB%'"来仅导出那些名称以TAB开头的表。类似地,您可以使用结构INCLUDE=TABLE:"NOTLIKE'TAB%'"来排除所有名称以TAB开头的表。作为另一种选择,您可以使用EXCLUDE参数来排除特定的对象。
  
  通过外部表,DataPump还可以用来传输表空间;它非常强大,能够即时地重定义并行方式,将更多的表添加到一个现有的进程中等等。

分享到:
本文"教你怎样在Oracle数据库中高速导出/导入"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4