优化EXP/IMP的方法:

上一篇 / 下一篇  2008-02-07 20:23:41

当需要exp/imp的数据量比较大时,这个过程需要的时间是比较长的,我们可以用一些方法来优化exp/imp的操作。

exp:使用直接路径direct=y

      oracle会避开sql语句处理引擎,直接从数据库文件中读取数据,然后写入导出文件.

     可以在导出日志中观察到:

      exp-00067: table xxx will be exported in conventional path

     

     如果没有使用直接路径,必须保证buffer参数的值足够大.

     

     有一些参数于direct=y不兼容,无法用直接路径导出可移动的tablespace,或者用query参数导出数据库子集.

     当导入导出的数据库运行在不同的os下时,必须保证recordlength参数的值一致.

 

imp:通过以下几个途径优化

     1.避免磁盘排序

       sort_area_size设置为一个较大的值,比如100M

     2.避免日志切换等待

       增加重做日志组的数量,增大日志文件大小.

     3.优化日志缓冲区

       比如将log_buffer容量扩大10(最大不要超过5M)

     4.使用阵列插入与提交

        commit = y

       注意:阵列方式不能处理包含LOBLONG类型的表,对于这样的table,如果使用commit = y,每插入一行,就会执行一次提交.

     5.使用NOLOGGING方式减小重做日志大小

       在导入时指定参数indexes=n,只导入数据而忽略index,在导完数据后在通过脚本创建index,指定 NOLOGGING选项

 

 

导出/导入与字符集

进行数据的导入导出时,我们要注意关于字符集的问题。在EXP/IMP过程中我们需要注意四个字符集的参数:导出端的客户端字符集,导出端数据库字符集,导入端的客户端字符集,导入端数据库字符集。

我们首先需要查看这四个字符集参数。

查看数据库的字符集的信息:

SQL> select * from nls_database_parameters;

 

PARAMETER                     VALUE

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

NLS_LANGUAGE                  AMERICAN

NLS_TERRITORY                  AMERICA

NLS_CURRENCY                  $

NLS_ISO_CURRENCY              AMERICA

NLS_NUMERIC_CHARACTERS        .,

NLS_CHARACTERSET              ZHS16GBK

NLS_CALENDAR                  GREGORIAN

NLS_DATE_FORMAT               DD-MON-RR

NLS_DATE_LANGUAGE             AMERICAN

NLS_SORT                        BINARY

NLS_TIME_FORMAT               HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT          DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT            HH.MI.SSXFF AM TZH:TZM

NLS_TIMESTAMP_TZ_FORMAT       DD-MON-RR HH.MI.SSXFF AM TZH:TZM

NLS_DUAL_CURRENCY             $

NLS_COMP                      BINARY

NLS_NCHAR_CHARACTERSET        ZHS16GBK

NLS_RDBMS_VERSION             8.1.7.4.1

 

NLS_CHARACTERSETZHS16GBK是当前数据库的字符集。

 

我们再来查看客户端的字符集信息:

客户端字符集的参数NLS_LANG=_<territory >.

language:指定oracle消息使用的语言,日期中日和月的显示。

Territory:指定货币和数字的格式,地区和计算星期及日期的习惯。

Characterset:控制客户端应用程序使用的字符集。通常设置或等于客户端的代码页。

           或者对于unicode应用设为UTF8

 

windows中,查询和修改NLS_LANG可在注册表中进行:

HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\

xx指存在多个Oracle_HOME时的系统编号。

 

unix中:

$ env|grep NLS_LANG

NLS_LANG=simplified chinese_china.ZHS16GBK

修改可用:

$ export NLS_LANG=AMERICAN_AMERICA.UTF8

 

通常在导出时最好把客户端字符集设置得和数据库端相同。当进行数据导入时,主要有以下两种情况:

(1)   源数据库和目标数据库具有相同的字符集设置。

这时,只需设置导出和导入端的客户端NLS_LANG等于数据库字符集即可。

(2)   源数据库和目标数据库字符集不同。

先将导出端客户端的NLS_LANG设置成和导出端的数据库字符集一致,导出数据,然后将导入端客户端的NLS_LANG设置成和导出端一致,导入数据,这样转换只发生在数据库端,而且只发生一次。

这种情况下,只有当导入端数据库字符集为导出端数据库字符集的严格超集时,数据才能完全导成功,否则,可能会有数据不一致或乱码出现。

 

 

 

不同版本的EXP/IMP问题

一般来说,从低版本导入到高版本问题不大,麻烦的是将高版本的数据导入到低版本中,在Oracle9i之前,不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决:

1、在高版本数据库上运行底版本的catexp.sql

2、使用低版本的EXP来导出高版本的数据;

3、使用低版本的IMP将数据库导入到低版本数据库中;

4、在高版本数据库上重新运行高版本的catexp.sql脚本。

但在9i中,上面的方法并不能解决问题。如果直接使用低版本EXP/IMP会出现如下错误:

EXP-00008: ORACLE error %lu encountered

ORA-00904: invalid column name

这已经是一个公布的BUG,需要等到Oracle10.0才能解决,BUG号为2261722,你可以到METALINK上去查看有关此BUG的详细信息。

BUGBUG,我们的工作还是要做,在没有Oracle的支持之前,我们就自己解决。在Oracle9i中执行下面的SQL重建exu81rls视图即可。

CREATE OR REPLACE view exu81rls

(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)

AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,

decode(bitand(r.stmt_type,1), 0,'', 'SELECT,')

|| decode(bitand(r.stmt_type,2), 0,'', 'INSERT,')

|| decode(bitand(r.stmt_type,4), 0,'', 'UPDATE,')

|| decode(bitand(r.stmt_type,8), 0,'', 'DELETE,'),

r.check_opt, r.enable_flag,

DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)

from user$ u, obj$ o, rls$ r

where u.user# = o.owner#

and r.obj# = o.obj#

and (uid = 0 or

uid = o.owner# or

exists ( select * from session_roles where role='SELECT_CATALOG_ROLE')

)

/

grant select on sys.exu81rls to public;

/

 

可以跨版本的使用EXP/IMP,但必须正确地使用EXPIMP的版本:
1.
总是使用IMP的版本匹配数据库的版本,如:要导入到817中,使用817IMP工具.

2.总是使用EXP的版本匹配两个数据库中最低的版本,如:从9201817中导入,则使用817版本的EXP工具.


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-10-07  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 1550
  • 日志数: 34
  • 图片数: 1
  • 建立时间: 2007-12-06
  • 更新时间: 2008-03-19

RSS订阅

Open Toolbar