先由exp把數據卸出到文件系統, 產生一個.dmp文件, 然后必要時再由imp將數據裝入數據庫. 對於一般中小型數據庫來說, 全數據庫的exp所產生的dmp文件可能小於2GB, 但對稍大型的數據庫, exp產生的數據動輒數十至上百個GB. 而現時多數操作系統為32位, 其文件系統允許的最大文件為2GB. 這樣顯然不能由文件系統存放exp產生的數據. 這是問題之一. 另一個問題是隨着數據庫的不斷增大, exp所需時間越來越長以致實際上很難實施. 本文針對以上兩個問題討論相應對策.
管道
管道 是一種偽文件. 它存在於內存中, 用於快速I/O操作. 管道的緩沖區采用先進先出機制, 即寫管道進程寫到緩沖區頭部而讀管道進程讀取管道尾部. 建立管道的命令為”mknod filename p".
gzip命令
名稱
gzip, gunzip, zcat -壓縮或解壓文件
總覽
gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ... ]
gunzip [ -acfhlLnNrtvV ] [-S suffix] [ name ... ]
zcat [ -fhLV ] [ name ... ]
描述
Gzip使用lempel - ziv編碼減少指定文件的大小(LZ77)。在可能的情況下,每個文件都被一個擴展名替換.gz,同時保持相同的所有權模式,訪問和修改時間。(默認擴展名對於VMS為-gz,對於MSDOS,OS /2 FAT,Windows NT FAT和Atari為Z。) 如果沒有指定文件,或者文件名是“-”,則標准輸入被壓縮到標准輸出。Gzip只會嘗試壓縮常規文件。特別是,它將忽略符號鏈接。
如果壓縮文件名對其文件系統太長,則gzip將其截斷。Gzip試圖只截斷長度超過3個字符文件名稱的部分。(部分是由點來分隔的。) 如果名稱僅由小部分組成,最長的部分被截斷。例如,如果文件名限制在14個字符,那么gzip.msdos.exe被壓縮為gzi.msd.exe.gz。在沒有限制文件名長度的系統上,名稱不會被截斷。
。。。。。。
選項
-f --force
強制壓縮或解壓,即使該文件有多個鏈接或相應的文件已經存在,或者將壓縮的數據從終端讀取或寫入到終端。如果輸入數據沒有gzip識別的格式,並且如果選項--stdout也被給出,那么將輸入數據復制到標准輸出:讓zcat表現為cat。
數據流重定向
標准輸入(stdin):代碼為0,使用<或<<;
標准輸出(stdout):代碼為1,使用>或>>;
標准錯誤輸出(stderr):代碼為2,使用2>或2>>
解決方案
1.建立命名管道
mknod mypipe p
2.結合exp和gzip將導出的dmp文件直接壓縮
exp $SWITCH_DBUSER/$SWITCH_DBPASS file=$HOME/file/expdp/mypipe tables=card_bin &
gzip <$HOME/file/expdp/mypipe >$HOME/file/expdp/card_bin.gz
如此即解決了直接導出dmp文件過大的弊端
如何通過備份的數據進行恢復呢
3.解壓縮gz文件
gunzip -c card_bin.gz > card_bin.dmp
4.imp導入dmp文件
imp $SWITCH_DBUSER/$SWITCH_DBPASS IGNORE=y file=card_bin.dmp full=y
參考資料
《man gzip》
《鳥哥的Linux私房菜——基礎學習篇》
《https://yq.aliyun.com/ziliao/115289》
《http://blog.csdn.net/cnmilan/article/details/40592305》