exp_imp与expdp_impdp对比和优化事项

exp/imp与expdp/impdp 对比


运行位置不同

exp/imp不同模式原理:

 exp/imp 默认会是传统路径, 这种模式下,是用SELECT 加数据查询出来,然后写入buffer cache,

在将这些记录写入evaluate buffer. 最后传到Export客户端,在写入dump文件。

 直接路径模式下,数据直接从硬盘读取,然后写入PGA, 格式就是export的格式,不需要转换,

数据再直接传到export 客户端,写入dump 文件.这种模式没有经过evaluation buffer。 少了一

个过程,导出速度提高也是很明显.

-----------------------------------

expdp/impdp不同模式原理:

 expdp/impdp 默认就是使用直接路径的,所以expdp要比exp块

 Network Link这种模式很方便,但是速度是最慢的,因为它是通过insert,select + dblink来实

现的。速度慢也由此可见了。

----------------------------------------------------------------------

网络和磁盘影响

 expdp/impdp 是服务端程序,影响它速度的只有磁盘IO。

 exp/imp 可以在服务端,也可以在客户端。所以,它受限于网络和磁盘。

----------------------------------------------------------------------

功能上的区别

 更换表空间,用exp/imp 的时候,要想更改表所在的表空间,需要手工去处理一下,

如alter table xxx move tablespace_new之类的操作。

用impdp 只要用remap_tablespace='tabspace_old':'tablespace_new'

-----------------------------------

当指定一些表的时候,使用exp/imp时,tables的用法是

tables=('table1','table2','table3')。expdp/impdp用法是tables='table1','table2','table3'

-----------------------------------

是否要导出数据行

 exp (ROWS=Y 导出数据行,ROWS=N 不导出数据行)

 expdp  content(ALL:对象+导出数据行,DATA_ONLY:只导出对象,

METADATA_ONLY:只导出数据的记录)

======================================================================

使用中的优化事项

EXP

 和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

--直接路径不能使用在tablespace-mode

--直接路径不支持query 参数,query只能在conventional path模式下使用。

-- buffer 选项只对conventional  path  exp 有效。 对于直接路径没有影响。 对

直接路径, 应该设置RECORDLENGTH 参数。

-- 对于直接路径下,RECORDLENGTH参数建议设成64k(65535)。这个值对

性能提高比较大

----------------------------------------------------------------------

IMP

 Oracle Import进程需要花比Export进程数倍的时间将数据导入数据库。某些关键时刻,

导入是为了应对数据库的紧急故障恢复。为了减少宕机时间,加快导入速度显得至关重要

(1)避免I/O竞争

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

间导入数据,不要在导入数据时运行job等可能竞争系统资源的操作。

(2)增加排序区

 Oracle Import进程先导入数据再创建索引,不论INDEXES值设为YES或者NO,主键的索引是一定会创建

的。创建索引的时候需要用到排序区,在内存大小不足的时候,使用临时表空间进行磁盘排序,由于磁

盘排序效率和内存排序效率相差好几个数量级。增加排序区可以大大提高创建索引的效率,从而加快导入

速度。

(3)调整BUFFER选项

 Imp 参数BUFFER定义了每一次读取导出文件的数据量,设的越大,就越减少Import 进程读取数据的次数,\

从而提高导入效率。BUFFER的大小取决于系统应用、数据库规模,通常来说,设为百兆就足够了。其用法如下:

 imp  user/pwd  fromuser=user1  touser=user2  file=/tmp/imp_db_pipe1  commit=y

feedback=10000 buffer=10240000

(4)使用COMMIT=Y选项

 COMMIT=Y表示每个数据缓冲满了之后提交一次,而不是导完一张表提交一次。这样会大大减少对系统回滚段

等资源的消耗,对顺利完成导入是有益的。

(5)使用INDEXES=N选项

 前面谈到增加排序区时,说明Imp 进程会先导入数据再创建索引。导入过程中建立用户定义的索引,特别是

表上有多个索引或者数据表特别庞大时,需要耗费大量时间。某些情况下,需要以最快的时间导入数据,而

索引允许后建,我们就可以使用INDEXES=N 只导入数据不创建索引,从而加快导入速度。

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

第一次导入数据,第二次导入索引。其用法如下:

imp  user/pwd  fromuser=user1  touser=user2  file=/tmp/imp_db_pipe1  commit=y

feedback=10000 buffer=10240000 ignore=y rows=y indexes=n

-----------------------------------

imp  user/pwd  fromuser=user1  touser=user2  file=/tmp/imp_index_pipe1  commit=y

feedback=10000 buffer=10240000 ignore=y rows=n indexes=y

(6)增加  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

----------------------------------------------------------------------

EXPDP

 据泵与exp/imp 来说性能有很大的提高, 其中影响最大的就是paralle。

 可以这么来看:  expdp/impdp=exp/imp+direct  moe  +  paralle.

 所以, 使用数据泵,要想提高速度,就要设置并行参数

 expdp full=y directory=dump dumpfile=orcl_%U.dmp parallel=4

 那么expdp将为parallel 创建4个文件: ORCL_01.DMP,RCL_02.DMP ,ORCL_03.DMP,RCL_04.DMP。

每个进程一个文件。  这样的话,每个文件的大小会因进程而不同。 可以某个文件很大,某个文件

却很小。 要解决这个问题,就是设置filesize 参数。 来指定每个文件的最大值。 这样当一个文件

达到最大值的之后,就会创建一个新的文件

 一般parall 参数值等于CPU 的个数。而且要小于dump文件的个数

 sql> show parameter cpu

----------------------------------------------------------------------

IMPDP

注意事项:

(1)导入的时候可能会停在某个地方,比如在创建索引的时候,可能在一个地方停了十几分钟。

这个时候切记不要中断过程。  这个时候可能是需要导入的数据比较多。  

 可以在不同时段观察下表空间大小的变化。  如果表空间一直在变化,说明还在导入,这个

时候耐心等待就好。

(2)导出导入的过程,尽量避免用ssh连上服务器,在客户端的ssh里执行备份恢复命令。 因为这

样,如果连接中断,备份也就中断了。 可以将备份脚本添加到crontab 里。 让备份在服务器上

执行。 这样即使ssh中断,备份和恢复也不受影响。


你可能感兴趣的:(exp,imp)