Oracle Exp/Imp 调优

Oracle Exp/Imp工具是一个操作简单、方便灵活的备份恢复和数据迁移工具,它可以实施全库级、用户级、表级的数据备份和恢复。对于数据量在G级或G级以内,强调高可用性,可以容忍少量数据丢失的数据库系统,Exp/Imp是普遍使用的逻辑备份方式。目前现网很多生产系统均使用Exp/Imp进行备份恢复。数据量达到G级以后,备份恢复的时间明显拉长了,有没有方法能够有效提高Exp/Imp的速度呢?答案是肯定的,某些方法还可以成倍的提高速度,本文就从 Exp、Imp两个工具分别探讨优化备份恢复性能的方法。

 

  一、Exp调优

  1.使用DIRECT和RECORDLENGTH选项

  DIRECT参数定义了导出是使用直接路径方式(DIRECT=Y),还是常规路径方式(DIRECT=N)。常规路径导出使用SQL SELECT语句从表中抽取数据,直接路径导出则是将数据直接从磁盘读到PGA再原样写入导出文件,从而避免了SQL命令处理层的数据转换过程,大大提高了导出效率。在数据量大的情况下,直接路径导出的效率优势更为明显,可比常规方法速度提高三倍之多。

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

exp userid=system/manager full=y direct=y recordlength=65535 file=
exp_full.dmp log=exp_full.log

  直接路径导出根据Oracle版本不同,有一些使用限制。比较重要的限制有,8i及以下版本不支持导出客户端和数据库的字符集转换,因此导出前必须保证NLS_LANG设置正确;8.1.5及以下版本不支持导出含LOBs对象的表;不能使用QUERY参数等。

  2.使用管道技术

  管道是从一个程序进程向另一个程序进程单向传送信息的技术。通常,管道把一个进程的输出传给另一进程作为输入。如果导出的数据量很大,可以利用管道直接生成最终的压缩文件,所耗费的时间和不压缩直接导出的时间相当。这样一来,不仅能够解决磁盘空间不足的问题,而且省去了单独压缩文件的时间;如果需要传输导出文件,还可以减少网络传输的时间。比如,一个10G的文件单独压缩可能需要半小时以上的时间。虽然管道技术不能够直接缩短Exp/Imp本身的时间,但节省出来的压缩时间非常可观。管道和Exp结合的具体使用方法如下:

  导出数据示例:

% mknod /tmp/exp_pipe p # Make the pipe
% compress < /tmp/exp_pipe > export.dmp.Z & # Background compress
% exp file=/tmp/exp_pipe # Export to the pipe

  二、Imp调优

  Oracle Import进程需要花比Export进程数倍的时间将数据导入数据库。某些关键时刻,导入是为了应对数据库的紧急故障恢复。为了减少宕机时间,加快导入速度显得至关重要。没有特效办法加速一个大数据量的导入,但我们可以做一些适当的设定以减少整个导入时间。

  1.使用管道技术

  前面已经说明了Exp时如何使用管道,在导入时管道的作用是相同,不仅能够解决磁盘空间不足的问题,而且省去了单独解压缩文件的时间。在大数据量导入导出的时候,推荐一定要使用管道。

  导入数据示例:

% mknod /tmp/imp_pipe p # Make the pipe
% uncompress < export.dmp.Z > /tmp/imp_pipe & # Background uncompress
% imp file=/tmp/imp_pipe # Import from the pipe

  2.避免I/O竞争

  Import是一个I/O密集的操作,避免I/O竞争可以加快导入速度。如果可能,不要在系统高峰的时间导入数据,不要在导入数据时运行job等可能竞争系统资源的操作。

  3.增加排序区

  Oracle Import进程先导入数据再创建索引,不论INDEXES值设为YES或者NO,主键的索引是一定会创建的。创建索引的时候需要用到排序区,在内存大小不足的时候,使用临时表空间进行磁盘排序,由于磁盘排序效率和内存排序效率相差好几个数量级。增加排序区可以大大提高创建索引的效率,从而加快导入速度。

  8i及其以下版本:导入数据前增加数据库的sort_area_size大小,可设为正常值的5-10倍。但这个值设定会影响到所有会话,设的过高有可能导致内存不足出现paging, swapping现象。更为稳妥的方法是,对于大表和索引特别多的表,只导数据不导索引。导完数据后,创建一个会话,设定当前会话的 sort_area_size一个足够大的值,再手工创建索引。

  9i:在workarea_size_policy=AUTO的情况下,所有会话的UGA共用pga_aggregate_target定义的内存,不必单独设定sort_area_size。导入数据前增加pga_aggregate_target大小,如果机器内存够大,可从通常设定的 500M提高到1-2G。pga_aggregate_target大小可以动态调整,导入完成后可在线调回原值。

  4.调整BUFFER选项

  Imp参数BUFFER定义了每一次读取导出文件的数据量,设的越大,就越减少Import进程读取数据的次数,从而提高导入效率。BUFFER的大小取决于系统应用、数据库规模,通常来说,设为百兆就足够了。其用法如下:

imp user2/pwd fromuser=user1 touser=user2 file=/tmp/imp_db_pipe1 commi
t=y feedback=10000 buffer=10240000

  5.使用COMMIT=Y选项

  COMMIT=Y表示每个数据缓冲满了之后提交一次,而不是导完一张表提交一次。这样会大大减少对系统回滚段等资源的消耗,对顺利完成导入是有益的。

  6.使用INDEXES=N选项

  前面谈到增加排序区时,说明Imp进程会先导入数据再创建索引。导入过程中建立用户定义的索引,特别是表上有多个索引或者数据表特别庞大时,需要耗费大量时间。某些情况下,需要以最快的时间导入数据,而索引允许后建,我们就可以使用INDEXES=N 只导入数据不创建索引,从而加快导入速度。

  我们可以用INDEXFILE选项生成创建索引的DLL脚本,再手工创建索引。我们也可以用如下的方法导入两次,第一次导入数据,第二次导入索引。其用法如下:

imp user2/pwd fromuser=user1 touser=user2 file=/tmp/imp_db_pipe1 commit=y feed
back=10000 buffer=10240000 ignore=y rows=y indexes=n
imp user2/pwd fromuser=user1 touser=user2 file=/tmp/imp_index_pipe1 comm
it=y feedback=10000 buffer=10240000 ignore=y rows=n indexes=y

  7.增加LARGE_POOL_SIZE

  如果在init.ora中配置了MTS_SERVICE,MTS_DISPATCHERS等参数,tnsnames.ora中又没有 (SERVER=DEDICATED)的配置,那么数据库就使用了共享服务器模式。在MTS模式下,Exp/Imp操作会用到LARGE_POOL,建议调整LARGE_POOL_SIZE到150M。

  检查数据库是否在MTS模式下:

  SQL>select distinct server from v$session;

  如果返回值出现none或shared,说明启用了MTS。



oracle 数据备份之exp优化

 在工作中经常需要对oracle数据库进行备份、异地恢复的情况。

 
Oracle的常规备份无非是exp/imp,expdp/impdp,rman三种方式。
  1. exp/imp简单方便,适用于跨db版本、跨os平台、异地备份等情况,是大家最常用的一种备份方式。
  2. expdp/impdp是10g以后推出的备份方式,其特点就是效率的大幅改善,据eygle报告,impdp相比与传统imp有20倍速度提升,其最大的缺点是不能跨数据库版本,连小版本号也不行(例如11.1到11.2)。
  3. rman相比前两种备份方式,相对配置复杂,一般是DBA作为前两种方案的备份。

先看看exp/imp的用法:

1.基本的exp写法

  1. exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log
  2. user: oracle用户名
  3. passwd:数据库用户密码
  4. infodb81: 数据库的连接字符串
  5. file:备份后的文件名
  6. log: 备份日志文件

2.exp的参数

参数一:buffer
 
  1. exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log buffer=4096000000
  2.  
  3. 注意:buffer的单位是bytes,例如要设置1M,则是1024000,上面的例子设置的是400M。 
  4. 根据我们测试的结果,加入buffer参数后,约有40%的性能提升。
  5.  
  6. 性能对比:
  7. 加入buffer参数前(数据约9G,共31分钟) 
  8. ========== 备份用户sinosybak 11-02-21 02:08:16 ====================
  9. ========== 备份用户shyang 11-02-21 02:35:49 ====================
  10. 加入Buffer参数后(约18分钟) 
  11. ========== 备份用户sinosybak 11-02-28 02:25:04 ====================
  12. ========== 备份用户shyang 11-02-28 02:43:52 ====================

 

参数二:direct
  1. exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log direct=y recordlength=65536

  2. direct : 直接导出,数据从磁盘读入到高速缓存,直接写入到最终文件,所以没有数据行检查与匹配的过程。据不权威的评测结果,性能有50%到70%的提升。
  3. 注意:
  4. 1.recordlength参数(IO缓冲大小),与direct参数配对使用,默认该参数为1024bytes,上面的例子为64K(最大值也为64K)。
  5. 2.使用direct后,buffer参数失效;
  6. 3.使用direct,不支持query子句(没有行匹配的过程),不支持带Blob类型字段的表,但是系统会自动判断、自动切换,也就是说不会因为一张表的问题,导致整个schema不能使用direct备份;
  7. 4.direct不支持表空间导出。

 

参数三:consistent

  1. exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log consistent=y
  2.  
  3. consistent : 交叉一致性,用在序列值小于表中最大值的情况。
  4.  
  5. 例如:exp默认情况下,先导出序列,后导出表,如果序列导出之后,表又使用序列插入了新的数据,就会导致数据不一致。

 

其他参数:

  1. USERID 用户名/口令
  2. FULL 导出整个文件 (N) BUFFER 数据缓冲区的大小
  3. OWNER 所有者用户名列表
  4. FILE 输出文件 (EXPDAT.DMP)
  5. TABLES 表名列表
  6. COMPRESS 导入一个范围 (Y)
  7. RECORDLENGTH IO 记录的长度
  8. GRANTS 导出权限 (Y)
  9. INCTYPE 增量导出类型
  10. INDEXES 导出索引 (Y)
  11. RECORD 跟踪增量导出 (Y)
  12. ROWS 导出数据行 (Y)
  13. PARFILE 参数文件名
  14. CONSTRAINTS 导出限制 (Y)
  15. CONSISTENT 交叉表一致性
  16. LOG 屏幕输出的日志文件
  17. STATISTICS 分析对象 (ESTIMATE)
  18. DIRECT 直接路径 (N)
  19. TRIGGERS 导出触发器 (Y)
  20. FEEDBACK 显示每 x 行 (0) 的进度
  21. FILESIZE 各转储文件的最大尺寸
  22. QUERY 选定导出表子集的子句
  23. 下列关键字仅用于可传输的表空间
  24. TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
  25. TABLESPACES 将传输的表空间列表

 




你可能感兴趣的:(Oracle Exp/Imp 调优)