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= |
直接路径导出根据Oracle版本不同,有一些使用限制。比较重要的限制有,8i及以下版本不支持导出客户端和数据库的字符集转换,因此导出前必须保证NLS_LANG设置正确;8.1.5及以下版本不支持导出含LOBs对象的表;不能使用QUERY参数等。
2.使用管道技术
管道是从一个程序进程向另一个程序进程单向传送信息的技术。通常,管道把一个进程的输出传给另一进程作为输入。如果导出的数据量很大,可以利用管道直接生成最终的压缩文件,所耗费的时间和不压缩直接导出的时间相当。这样一来,不仅能够解决磁盘空间不足的问题,而且省去了单独压缩文件的时间;如果需要传输导出文件,还可以减少网络传输的时间。比如,一个10G的文件单独压缩可能需要半小时以上的时间。虽然管道技术不能够直接缩短Exp/Imp本身的时间,但节省出来的压缩时间非常可观。管道和Exp结合的具体使用方法如下:
导出数据示例:
% mknod /tmp/exp_pipe p # Make the pipe |
二、Imp调优
Oracle Import进程需要花比Export进程数倍的时间将数据导入数据库。某些关键时刻,导入是为了应对数据库的紧急故障恢复。为了减少宕机时间,加快导入速度显得至关重要。没有特效办法加速一个大数据量的导入,但我们可以做一些适当的设定以减少整个导入时间。
1.使用管道技术
前面已经说明了Exp时如何使用管道,在导入时管道的作用是相同,不仅能够解决磁盘空间不足的问题,而且省去了单独解压缩文件的时间。在大数据量导入导出的时候,推荐一定要使用管道。
导入数据示例:
% mknod /tmp/imp_pipe p # Make 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 |
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 |
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数据库进行备份、异地恢复的情况。
- exp/imp简单方便,适用于跨db版本、跨os平台、异地备份等情况,是大家最常用的一种备份方式。
- expdp/impdp是10g以后推出的备份方式,其特点就是效率的大幅改善,据eygle报告,impdp相比与传统imp有20倍速度提升,其最大的缺点是不能跨数据库版本,连小版本号也不行(例如11.1到11.2)。
- rman相比前两种备份方式,相对配置复杂,一般是DBA作为前两种方案的备份。
先看看exp/imp的用法:
1.基本的exp写法
-
exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log
- user: oracle用户名
- passwd:数据库用户密码
- infodb81: 数据库的连接字符串
- file:备份后的文件名
- log: 备份日志文件
2.exp的参数
-
exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log buffer=4096000000
- 注意:buffer的单位是bytes,例如要设置1M,则是1024000,上面的例子设置的是400M。
- 根据我们测试的结果,加入buffer参数后,约有40%的性能提升。
- 性能对比:
- 加入buffer参数前(数据约9G,共31分钟)
- ========== 备份用户sinosybak 11-02-21 02:08:16 ====================
- ========== 备份用户shyang 11-02-21 02:35:49 ====================
- 加入Buffer参数后(约18分钟)
- ========== 备份用户sinosybak 11-02-28 02:25:04 ====================
- ========== 备份用户shyang 11-02-28 02:43:52 ====================
-
exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log direct=y
recordlength=65536
-
direct : 直接导出,数据从磁盘读入到高速缓存,直接写入到最终文件,所以没有数据行检查与匹配的过程。据不权威的评测结果,性能有50%到70%的提升。
- 注意:
- 1.recordlength参数(IO缓冲大小),与direct参数配对使用,默认该参数为1024bytes,上面的例子为64K(最大值也为64K)。
- 2.使用direct后,buffer参数失效;
- 3.使用direct,不支持query子句(没有行匹配的过程),不支持带Blob类型字段的表,但是系统会自动判断、自动切换,也就是说不会因为一张表的问题,导致整个schema不能使用direct备份;
- 4.direct不支持表空间导出。
参数三:consistent
-
exp userid/passwd@infodb81 file=user_$DATE.dmp log=user_$DATE.log consistent=y
- consistent : 交叉一致性,用在序列值小于表中最大值的情况。
- 例如:exp默认情况下,先导出序列,后导出表,如果序列导出之后,表又使用序列插入了新的数据,就会导致数据不一致。
其他参数:
-
USERID 用户名/口令
- FULL 导出整个文件 (N) BUFFER 数据缓冲区的大小
- OWNER 所有者用户名列表
- FILE 输出文件 (EXPDAT.DMP)
- TABLES 表名列表
- COMPRESS 导入一个范围 (Y)
- RECORDLENGTH IO 记录的长度
- GRANTS 导出权限 (Y)
- INCTYPE 增量导出类型
- INDEXES 导出索引 (Y)
- RECORD 跟踪增量导出 (Y)
- ROWS 导出数据行 (Y)
- PARFILE 参数文件名
- CONSTRAINTS 导出限制 (Y)
- CONSISTENT 交叉表一致性
- LOG 屏幕输出的日志文件
- STATISTICS 分析对象 (ESTIMATE)
- DIRECT 直接路径 (N)
- TRIGGERS 导出触发器 (Y)
- FEEDBACK 显示每 x 行 (0) 的进度
- FILESIZE 各转储文件的最大尺寸
- QUERY 选定导出表子集的子句
- 下列关键字仅用于可传输的表空间
- TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
- TABLESPACES 将传输的表空间列表