首页  编辑  

Exp/Imp大量数据

Tags: /超级猛料/Database.数据库相关/Oracle/导入,导出/   Date Created:

Exp/Imp 大量数据

摘自:宏贝思

Oracle的exp/imp是许多用户经常使用的两个工具. 它们常被用来做数据库的逻辑备份,数据库重组和数据转移等工作. 先由exp把数据卸出到文件系统, 产生一个.dmp文件, 然后必要时再由imp将数据装入数据库. 对于一般中小型数据库来说, 全数据库的exp所产生的dmp文件可能小于2GB, 但对稍大型的数据库, exp产生的数据动辄数十至上百个GB. 而现时多数操作系统为32位, 其文件系统允许的最大文件为2GB. 这样显然不能由文件系统存放exp产生的数据. 这是问题之一. 另一个问题是随着数据库的不断增大, exp所需时间越来越长以致实际上很难实施. 本文针对以上两个问题讨论相应对策.

 

我们以UNIX为例首先看看如何超越2GB限制. 这需利用UNIX的通用技术, 如管道(named pipe), 数据拷贝工具dd以及数据压缩(compress). 下面分别讨论这几种技术.

· 管道  是一种伪文件. 它存在于内存中, 用于快速I/O操作. 管道的缓冲区采用先进先出机制, 即写管道进程写到缓冲区头部而读管道进程读取管道尾部. 建立管道的命令为"mknod filename p".

·dd   允许我们从一个设备拷贝数据到另一个设备.

·compress   为UNIX数据压缩工具.

实施exp之前, 我们可先检查所产生dmp文件的大小. 以下步骤既可实现,

1.      生成管道:  

$  mknod  /tmp/mypipe  p

2.      exp结果输出到该管道

$  exp  file=/tmp/mypipe  <…其它exp选项>  &

3.      读取管道并把结果输出到管道, 只为查看数据量:

$  dd  if=/tmp/mypipe  of=/dev/null

结果返回exp (.dmp)文件大小, 单位为块(512 bytes).

现在我们可以着手讨论具体方法,

1.      文件压缩

2.      直接exp到磁带

3.      综合方法

首先看文件压缩方法. 利用文件压缩我们可尽量避免dmp文件大小超过2GB限制. 我们利用UNIX的管道技术, 具体步骤如下,

1.      启动compress进程,  使之从管道读取数据并输出到磁盘文件.

$  mknod  /tmp/exp_pipe  p

$  compress  < /tmp/exp_pipe > export.dmp.Z  &

2.      exp到管道.

$  exp  file=/tmp/exp_pipe  …   &

imp时情况类似.

再看看直接exp到磁带上的方法.

             $  exp  file=/dev/rmt/0m  volsize=4G

             $  imp  file=/dev/rmt/0m  volsize=4G

最后看看exp到裸设备上的方法,

             $  exp  file=/dev/rdsk/c0t3d0s0  volsize=4G

             imp类似.

以上方法都可使我们避免2GB限制.

 

下面讨论如何缩短exp索需时间的问题. 目前多数用户会采用exp到磁带的方法只因没有足够的剩余硬盘空间. 而整个exp过程所花时间的大部分都在写磁带上. 通过我们上面对UNIX工具的讨论, 我们可以做到先exp到管道, 再将管道数据压缩后输出到磁带上. 这样写磁带的数据量可大大减少, 从而在相当程度上缩短写磁带时间. 另外从Oracle内部角度讲, 从7.3版开始, Oracle允许用户做direct path export, 即跳过Oracle

             $  make  -f  $ORACLE_HOME/rdbms/lib/oracle.mk  expst

             $  make  -f  $ORACLE_HOME/rdbms/lib/oracle.mk  impst

以上步骤产生的可执行文件expst (exp single task)和impst与exp/imp用法完全相同. 使用它们比使用exp/imp可节省多至30%的时间. 但在使用它们时千万要注意一点, 即一定要保证在使用expst/impst时不能有任何其他用户在使用Oracle数据库, 否则数据库会产生不可预知的后果甚至毁坏.

【最后更新: 06/03/2002 10:40:24 】