https://wangbinbin0326.github.io/2017/03/31/oracle%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB%E4%B9%8BExp%E5%92%8CExpdp%E5%AF%BC%E5%87%BA%E6%95%B0%E6%8D%AE%E7%9A%84%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94%E4%B8%8E%E4%BC%98%E5%8C%96/

使用Exp和Expdp导出数据的性能对比与优化

前言

数据备份对信息系统的安全运行至关重要,我们的用户中,使用RMan或第三方专业备份软件的越来越多,但是很多用户仍然保留了传统的Exp作为备份策略的一部分,主要是由于这种备份方式简单易用,而且恢复到其他机器上也很方便,所以,虽然有其他的备份方式,但是Exp方式仍然会同时使用,甚至还有不少的用户只有这种备份方式(可能因为他们觉得掌握其他技术太复杂)。

随着用户的数据量增长,Exp导出方式存在的问题也日渐突出,主要就是耗时长,有的甚至超过3个小时,加上常见的后台自动作业:汇总表的计算,自动费用的计算,统计信息的收集等工作,使一个晚上的时间安排越来越紧张。

有没有办法提高Exp执行的性能呢?以前我做过一些试验,查阅了很多资料,总结过一些经验,最近拿到了一个用户的近300G数据,再次进行了一系列大数据量的导出对比试验,发现几个参数的设置对Exp导出耗时的影响较大,经过优化后,Exp导出的性能得到了较大提升,但是与Expdp相比,仍然是后者要快得多,下面将试验情况和相关知识做一个介绍,以便我们在帮助用户制定备份策略时参考。

试验环境

硬件
processor: 8
model name : Intel(R) Xeon(R) CPU E7- 2870 @ 2.40GHz
cpu MHz : 2396.863
MemTotal: 16333448 kB
Disk:SCSI

软件:Linux+Oracle 11.2.0.0

数据:原始共300G,经过收缩回滚表空间、临时表空间,以及一些表空间文件未使用的空间后,总共占用267G,其中包含了大量电子病历相关的LOB数据。

试验方法

在相同环境下,试验4种不同的导出数据的方式的耗时

方式 耗时 说明
Exp常规路径,未优化 5小时15分 5
Exp直接路径导出,不加参数优化 2小时38分 direct=y
Exp直接路径,参数优化 1小时40分 direct=y recordlength=65535 buffer=104857600
使用Expdp导出,参数优化 59分 parallel=3

结果表明:
速度最快的是Expdp方式,而Exp方式经过参数优化后,相对于不加任何参数的情况,快了近3倍。

原理说明

Exp默认是传统路径,这种模式下,是用Select来查询数据,然后写入buffer cache,在将这些数据写入evaluate buffer,最后传到Export客户端,再写入dump文件。

直接路径模式下,直接从硬盘读取数据,然后写入PGA,格式就是Export的格式,不需要转换,数据再直接传到Export客户端,写入dump文件。这种模式没有经过evaluation buffer,少了一个过程,导出速度提高也是很明显。

Exp没有并行参数,要进行并行导出,可以写多条命令同时导出,这种方式可用于特定的数据迁移情况,按表或表空间进行快速数据迁移。

Expdp是Oracle 10G上推出的一种先进的数据导出方式,比Exp有较大的性能提升,Expdp可以看成是Exp的升级版,相当于exp + direct mode + parallel。

注意: 一般情况可以替代Exp,但是还无法完全替代,主要是它需要在数据库服务器上执行,而Exp可以在任何一台客户端上执行。另外,据测试,Expdp在导出大型分区表(1T以上)的时候,光是分析的时间就超过2个小时,而且存在一些BUG。所以,有些用户仍然会使用Exp来进行数据备份。

参数优化

Exp相关参数

通过上面的分析,我们知道采用“直接路径”可以提高导出速度,这种模式重点说明2个参数:DIRECT和RECORDLENGTH参数。

  • DIRECT参数定义了导出是使用直接路径方式(DIRECT=Y),还是常规路径方式(DIRECT=N)。常规路径导出使用SELECT语句从表中抽取数据,评估后再写入,而直接路径导出则是将数据直接从磁盘读到PGA再原样写入导出文件,从而避免了SQL命令处理层的数据转换过程,大大提高了导出效率。

  • BUFFER参数用于设置了读取记录的缓存的大小,以字节为单位,即在array中最大数量的记录,该参数只对常规路径模式导出有效。

  • RECORDLENGTH参数是跟DIRECT=Y配合使用的参数,它定义了Export I/O缓冲的大小,作用类似于常规路径导出使用的BUFFER参数。建议设置RECORDLENGTH参数为最大I/O缓冲,即65535(64kb)。

需要强调是即使用直接路径导出模式,其中涉及LOB对象的表只会通过传统模式导出,所以,DIRECT=Y时,除了设置RECORDLENGTH参数之外,也需要设置BUFFER参数,一般情况可设置为104857600(100M),这一点是网上很多优化文章所忽略的。

另外,还可以修改Oracle初始化参数Multiple Block Read来提交读取数据的性能,经测试,效果不是很明显,前面的测试环境下,可减少10分钟左右的耗时。

1
exp userid=sys/his@zyyy full=y direct=y recordlength=65535 buffer=104857600 file=F:\zyyy\exp20120218.dmp log=F:\zyyy\exp20120218.log feedback=10000

Expdp相关参数

Parallel参数指明了导出并行度,根据CPU的个数进行设置,缺省是1,如果不设置,导出性能与Exp的直接路径导出模式差不了多少,就没有发挥出它的优势。

Dumpfile参数可配合Parallel参数指定多个导出文件,用于减少并发写入时的IO争用。

1
expdp sys/his@zyyy full=y directory=dump_dir parallel=3 dumpfile=expdp_0225_1.dmp,expdp_0225_2.dmp,expdp_0225_3.dmp logfile=expdp_0225.log

总结:
如果你仍然习惯使用Exp方式,如果要减少耗时,最好采用直接路径方式,并且设置RECORDLENGTH和BUFFER两个参数的值,可以大大提高导出性能。 如果你掌握了Expdp方式,使用合适的Parallel参数,实现快速导出,更重要的是Impdp的性能提升才是数据泵模式的真正优势所在,从一些Oracle爱好者的测试结果来看,确实差别非常大。

Exp和Expdp导出数据

方式 耗时 说明
IMP常规路径,未优化 3小时17分钟  
IMPdp的导入速度 3小时8分钟  
使用IMPdp导出,参数优化 2小时8分钟 parallel=3

数据泵的导入操作居然花了3个小时8分钟的时间,和IMP的导入速度十分接近,看来并非所有情况下都像Oracle描述的那样,数据泵的导入比普通导入效率有大幅度的提高。

上面一篇文章的测试中发现IMPDP的导入速度和IMP导入速度相差无几。而Oracle在介绍数据泵的时候,提到IMPDP的导入速度最高是IMP的10倍。不过好在IMPDP还是可以优化调整的,那就是通过设置PARALLEL来提高IMPDP的并行度。

oracle数据迁移之Exp和Expdp导出数据的性能对比与优化的更多相关文章

  1. 【转载】使用Exp和Expdp导出数据的性能对比与优化

    转自:http://blog.itpub.net/117319/viewspace-1410931/ 序:这方面的文章虽然很多人写过,但是结合实际进行详细的对比分析的不多,这里,结合所在公司的行业,进 ...

  2. 如何终止正在进行expdp导出数据的任务

    不能用ctrl+c来终止导出 一.按照以前的习惯,在进行oracle数据库数据导出操作时,大家一般都会使用组合键“CTRL+C”来终止导出操作.但这种方法在expdp导出数据时,却不能使用,因为虽然可 ...

  3. oracle exp(expdp)数据迁移(生产环境,进行数据对比校验)

    前言:客户需要迁移XX 库 ZJJJ用户(迁移到其他数据库),由于业务复杂,客户都弄不清楚里面有哪些业务系统,为保持数据一致性,需要停止业务软件,中间件,杀掉oracle进程. 一.迁移数据倒出部分= ...

  4. Oracle中exp,imp(导入导出)数据迁移注意事项

    这几天做开发库schema备份,出现些问题,记录一下.一,exp时,os语言环境和数据库不同时会自动发生转换.   如果操作系统的字符集小于数据库字符集,就可能出现乱码现象.imp时,同理,也是有可能 ...

  5. Oracle exp,imp,expdp,impdp数据导入导出

    一.导出模式(三种模式)及命令格式 1. 全库模式 exp 用户名/密码@网络服务名 full=y file=路径\文件名.dmp log=路径\文件名.log 2. 用户模式(一般情况下采用此模式) ...

  6. Oracle Imp and Exp (导入和导出) 数据 工具使用

    Oracle 提供两个工具imp.exe 和exp.exe分别用于导入和导出数据.这两个工具位于Oracle_home/bin目录下. 导入数据exp 1 将数据库ATSTestDB完全导出,用户名s ...

  7. Oracle EXPDP导出数据

    Oracle expdp导出表数据(带条件): expdp student/123456@orcl dumpfile=student_1.dmp logfile=student_1.log table ...

  8. oracle在cmd下通过命令导入导出数据

    1.首先在cmd下切换到oracle的客户端的exp.exe所在的bin目录下,例如 D:\oracle\product\10.2.0\client_2\BIN 数据导出:导出的数据库名称是在tnsn ...

  9. oracle登陆的命令是什么?导出数据表的命令是什么?

    登陆的命令: su - oracle sqlplus / as sysdba 导出数据表的命令: exp user/pwd@SID file=path/sth.dmp tables=(table1,t ...

随机推荐

  1. Python学习-前台开发-JavaScript、Dom和jQuery

    JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. ...

  2. Python全栈 MySQL 数据库 (表字段增、删、改、查、函数)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图         查询SQL变量 show variables 1.表字 ...

  3. 异步fifo的设计(FPGA)

    本文首先对异步 FIFO 设计的重点难点进行分析 最后给出详细代码 一.FIFO简单讲解 FIFO的本质是RAM, 先进先出 重要参数:fifo深度(简单来说就是需要存多少个数据)           ...

  4. String类型的方法使用

    String.equals()方法源代码: public boolean equals(Object anObject) { if (this == anObject) { return true; ...

  5. ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 C: 挂盐水

    http://acm.ocrosoft.com/problem.php?cid=1316&pid=2 题目描述 挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下:然后滴二滴,停一下:再滴三滴 ...

  6. qemu中device和driver的区别 使用9p文件系统

    qemu配置中经常会出现-driver/-device的选项,可以理解成-driver是后端设备,即一个实际的物理的磁盘:device是把这块磁盘插入到虚机中的pci控制器中. 这样的话,虚机也能看到 ...

  7. 【bzoj2969】矩形粉刷 期望

    题目描述 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两格子为对角的,平行于木板边界的一个子矩 ...

  8. [AtCoder ARC093F]Dark Horse

    题目大意:有$2^n$个人,每相邻的两个人比赛一次.令两个人的编号为$a,b(a\leqslant b)$,若$a\neq 1$,则$a$的人获胜:否则若$b\in S$则$b$获胜,不然$1$获胜. ...

  9. 关于Yarn源码那些事-前传之ResourceManager篇(一)初始化

    在关于Yarn那些事的博客里,介绍的主要是针对任务提交的一个动态流程说明,而其中牵涉到的一些细节问题,必须通过Resourcemanager的启动和NodeManager的启动,来更好的说明. 而本系 ...

  10. [spoj] FTOUR2 FREE TOUR II || 树分治

    原题 给出一颗有n个点的树,其中有M个点是拥挤的,请选出一条最多包含k个拥挤的点的路径使得经过的权值和最大. 正常树分治,每次处理路径,更新答案. 计算每棵子树的deep(本题以经过拥挤节点个数作为d ...