摘自:宏贝思
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数据库,
否则数据库会产生不可预知的后果甚至毁坏.
|