Oracle 的 exp/imp 是資料庫管理員常用的邏輯備份、重組與遷移工具。流程是先用 exp 將資料導出為 .dmp 檔案,再由 imp 導入目標資料庫。對中小型資料庫,完整導出檔案通常小於 2GB;但大型資料庫動輒數十至上百 GB,而 32 位元作業系統的檔案系統單一檔案上限為 2GB,導致無法直接存放導出檔。此外,隨著資料量增長,導出耗時過長,實際操作難度大增。本文針對這兩大痛點提供解決方案。
以 UNIX 環境為例,利用管道、dd、compress 等原生工具即可繞過限制。
mknod filename p。/dev/null 以計算資料量。$ mknod /tmp/mypipe p
$ exp file=/tmp/mypipe ... &
$ dd if=/tmp/mypipe of=/dev/null
回傳的區塊數(512 bytes/區塊)即為導出檔大小。
利用管道串接 compress,導出資料即時壓縮寫入磁碟:
$ mknod /tmp/exp_pipe p
$ compress < /tmp/exp_pipe > export.dmp.Z &
$ exp file=/tmp/exp_pipe ... &
導入時反向操作即可。
$ exp file=/dev/rmt/0m volsize=4G
$ imp file=/dev/rmt/0m volsize=4G
$ exp file=/dev/rdsk/c0t3d0s0 volsize=4G
以上方法均可繞過 2GB 檔案系統限制。
大多數用戶因磁碟空間不足而選擇導出至磁帶,但大部分時間消耗在寫入磁帶上。結合管道與壓縮,可先導出至管道,壓縮後再寫入磁帶,大幅減少磁帶 I/O 量,從而縮短備份窗口。
此外,Oracle 7.3 起支援 Direct Path Export,跳過 SQL 層直接讀取資料塊。需重新編譯專用執行檔:
$ make -f $ORACLE_HOME/rdbms/lib/oracle.mk expst
$ make -f $ORACLE_HOME/rdbms/lib/oracle.mk impst
產生的 expst/impst 用法與原指令相同,可節省 30% 以上時間。警告:使用時必須確保無其他使用者連線資料庫,否則可能導致資料損毀。