摘自:宏貝思
Oracle的exp/imp是許多用戶經(jīng)常使用的兩個(gè)工具.
它們常被用來做數(shù)據(jù)庫的邏輯備份,數(shù)據(jù)庫重組和數(shù)據(jù)轉(zhuǎn)移等工作.
先由exp把數(shù)據(jù)卸出到文件系統(tǒng),
產(chǎn)生一個(gè).dmp文件,
然后必要時(shí)再由imp將數(shù)據(jù)裝入數(shù)據(jù)庫.
對(duì)于一般中小型數(shù)據(jù)庫來說,
全數(shù)據(jù)庫的exp所產(chǎn)生的dmp文件可能小于2GB,
但對(duì)稍大型的數(shù)據(jù)庫,
exp產(chǎn)生的數(shù)據(jù)動(dòng)輒數(shù)十至上百個(gè)GB.
而現(xiàn)時(shí)多數(shù)操作系統(tǒng)為32位,
其文件系統(tǒng)允許的最大文件為2GB.
這樣顯然不能由文件系統(tǒng)存放exp產(chǎn)生的數(shù)據(jù).
這是問題之一.
另一個(gè)問題是隨著數(shù)據(jù)庫的不斷增大,
exp所需時(shí)間越來越長以致實(shí)際上很難實(shí)施.
本文針對(duì)以上兩個(gè)問題討論相應(yīng)對(duì)策.
?
我們以UNIX為例首先看看如何超越2GB限制.
這需利用UNIX的通用技術(shù),
如管道(named
pipe),
數(shù)據(jù)拷貝工具dd以及數(shù)據(jù)壓縮(compress).
下面分別討論這幾種技術(shù).
?管道?
是一種偽文件.
它存在于內(nèi)存中,
用于快速I/O操作.
管道的緩沖區(qū)采用先進(jìn)先出機(jī)制,
即寫管道進(jìn)程寫到緩沖區(qū)頭部而讀管道進(jìn)程讀取管道尾部.
建立管道的命令為”mknod
filename
p”.
?dd?
允許我們從一個(gè)設(shè)備拷貝數(shù)據(jù)到另一個(gè)設(shè)備.
?compress?
為UNIX數(shù)據(jù)壓縮工具.
實(shí)施exp之前,
我們可先檢查所產(chǎn)生dmp文件的大小.
以下步驟既可實(shí)現(xiàn),
1.
????
生成管道:
??
$?
mknod?
/tmp/mypipe?
p
2.
????
exp結(jié)果輸出到該管道
$?
exp?
file=/tmp/mypipe?
<…其它exp選項(xiàng)>?
&
3.
????
讀取管道并把結(jié)果輸出到管道,
只為查看數(shù)據(jù)量:
$?
dd?
if=/tmp/mypipe?
of=/dev/null
結(jié)果返回exp
(.dmp)文件大小,
單位為塊(512
bytes).
現(xiàn)在我們可以著手討論具體方法,
1.
????
文件壓縮
2.
????
直接exp到磁帶
3.
????
綜合方法
首先看文件壓縮方法.
利用文件壓縮我們可盡量避免dmp文件大小超過2GB限制.
我們利用UNIX的管道技術(shù),
具體步驟如下,
1.
????
啟動(dòng)compress進(jìn)程,?
使之從管道讀取數(shù)據(jù)并輸出到磁盤文件.
$?
mknod?
/tmp/exp_pipe?
p
$?
compress?
<
/tmp/exp_pipe
>
export.dmp.Z?
&
2.
????
exp到管道.
$?
exp?
file=/tmp/exp_pipe?
…??
&
imp時(shí)情況類似.
再看看直接exp到磁帶上的方法.
?????????????
$?
exp?
file=/dev/rmt/0m?
volsize=4G
?????????????
$?
imp?
file=/dev/rmt/0m?
volsize=4G
最后看看exp到裸設(shè)備上的方法,
?????????????
$?
exp?
file=/dev/rdsk/c0t3d0s0?
volsize=4G?
?????????????
imp類似.
以上方法都可使我們避免2GB限制.
?
下面討論如何縮短exp索需時(shí)間的問題.
目前多數(shù)用戶會(huì)采用exp到磁帶的方法只因沒有足夠的剩余硬盤空間.
而整個(gè)exp過程所花時(shí)間的大部分都在寫磁帶上.
通過我們上面對(duì)UNIX工具的討論,
我們可以做到先exp到管道,
再將管道數(shù)據(jù)壓縮后輸出到磁帶上.
這樣寫磁帶的數(shù)據(jù)量可大大減少,
從而在相當(dāng)程度上縮短寫磁帶時(shí)間.
另外從Oracle內(nèi)部角度講,
從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
以上步驟產(chǎn)生的可執(zhí)行文件expst
(exp
single
task)和impst與exp/imp用法完全相同.
使用它們比使用exp/imp可節(jié)省多至30%的時(shí)間.
但在使用它們時(shí)千萬要注意一點(diǎn),
即一定要保證在使用expst/impst時(shí)不能有任何其他用戶在使用Oracle數(shù)據(jù)庫,
否則數(shù)據(jù)庫會(huì)產(chǎn)生不可預(yù)知的后果甚至毀壞.
|