2021年9月14日 星期二

10.3 Export 與 Import

Export 與 Import 是用來將 Oracle 資料庫物件匯出與匯入的一種工具,主要的用途是作為資料庫的備份,或者是用來做資料庫的移轉與升級,例如要將一套 Oracle 10g 的資料庫升級為 Oracle 11g ,那麼就可以在一台新的機器上安裝好 Oracle 11g ,然後將 Oracle 10g 的資料庫 Export 再 Import 到 11g ,這樣就完成升級的動作。


使用 Export 這項工具,只要安裝完 Oracle 軟體,執行命令 exp 就可以使用,執行 exp help=y 會顯示出所有 exp 可使用的參數:


exp 可以匯出的範圍包括整個資料庫 (Full) ,或者是針對某些使用者的所有物件進行匯出 (Owner) ,也可以只匯出 Table ;使用上只要 exp 後面加上登入資料庫的帳號密碼,再加上要匯出的標的與匯出的檔名,這樣就可以簡單完成 export 的動作,例如:


$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

$ export ORACLE_SID=ORA11

$ exp system/manager full=y file=/orabak/exp_full.dmp log=/orabak/exp_full.log

  (匯出資料庫所有物件)

$ exp system/manager owner=scott file=/orabak/exp_scott.dmp log=/orabak/exp_scott.log

  (匯出 scott 這個使用者的所有物件)

$ exp \'/ as sysdba\' tables=hr.regions,hr.emp file=/orabak/hr.dmp log=/orabak/exp_hr.log

  (使用 sys 登入資料庫來匯出 hr.regions 與 hr.emp 這兩個 Table)


除此之外, exp 還有一些比較常用的參數,例如 filesize ,用來限制一個 dmp 檔案的大小,早期受限於作業系統的限制,有檔案大小上限的問題,而要匯出的資料量又很大的時候,就必須使用 filesize 來限制與切分所匯出的 dmp 檔案,這邊要注意的是,使用 filesize 時,必須要列出所有 dmp 檔的檔名,否則 exp 作業會因為一個 dmp 檔達到 filesize 上限之後,不知道要使用什麼檔名來匯出下一個而停滯在那邊,例如限制 filesize 為 100MB ,那麼總共要匯出的資料有 300MB 的話,就必須指定三個 dmp 檔給它;使用 direct=y 參數可以直接從 Disk I/O 在 exp 過程當中不經過 cache ,可以加快 exp 的速度;如果只是要匯出 Table 的結構不匯出資料,那麼可以使用 rows=n 。例如使用 filesize 匯出 employees 這個 Table 的資料,以及匯出 department 這個 Table 的結構:

$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

$ export ORACLE_SID=ORA11

$ exp scott/tiger tables=employees file=emp1.dmp,emp2.dmp,emp3.dmp filesize=100M direct=y log=emp.log

$ exp hr/welcome1 tables=department rows=n file=dep.dmp log=dep.log


exp 也可以透過 Query 參數來下條件,只匯出 Table 某些部分的資料,例如要匯出 employee_id < 200 的資料,那麼就可以在 exp 的過程中使用 Query 條件式來過濾:

$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

$ export ORACLE_SID=ORA11

$ exp hr/welcome1 tables=emp file=exp_emp.dmp query=\"where employee_id\<200\" log=exp_emp.log


exp 還有一個特點,就是可以透過 tnsnames 來連接資料庫, exp 作業不一定要在 DB Server 上執行,透過 tnsnames 的連接可以將 dmp 檔匯出到 client 端的 Server 上,例如透過一台 PC 主機將 orcl 資料庫的資料匯出:

D:\> set NLS_LANG=AMERICAN_AMERICA.AL32UTF8

D:\> exp scott/tiger@orcl tables=emp file=D:\orabak\exp_emp.dmp log=D:\orabak\exp_emp.log


最後要注意的是,執行 exp 之前,都必須要設定環境變數 NLS_LANG 與資料庫的字元集相同,否則有可能因字元集的問題導致匯出的資料不正確。


同樣的 Import 這項工具,執行命令為 imp ,使用 imp help=y 會列出所有可套用的參數:


使用 imp 只需給予 dmp 檔就可以將物件匯入資料庫,其中必須指定一種選項,匯入 dmp 所有的內容 (full=y) ,或者是指定匯入的 schema (fromuser, touser) ,例如:

$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

$ export ORACLE_SID=ORA11

$ imp \'/ as sysdba\' full=y file=emp1.dmp,emp2.dmp,emp3.dmp log=imp_emp.log

  (匯入所有 dmp 檔的內容)

$ imp system/manager fromuser=hr touser=hr file=exp_hr.dmp log=imp_hr.log

  (將 dmp 檔的內容,原本是從 hr 使用者匯出,現在也是匯入 hr 這個使用者底下)

$ imp system/manager fromuser=scott touser=hr file=exp_emp.dmp log=imp_hr.log

  (將 dmp 檔的內容,原本是從 scott 使用者匯出,現在匯入到 hr 這個使用者底下)


其餘較常使用的參數如 rows=n 不匯入資料; indexes=n 不匯入 index ; ignore=y 忽略 imp 過程中所有錯誤持續 import ,例如 import 過程中碰到資料重複的錯誤 Ora-0001 unique constraint violated ,要忽略掉這些重複的資料,其餘不重複的資料要繼續 import ,那麼就可以使用 ignore=y ,否則 imp 作業會因為發生錯誤而中斷開來; show=y 這個參數也蠻常使用,意思是由 dmp 檔案中產生出建立物件的 DDL ,不會真正的執行 import 的動作,例如從 exp_emp.dmp 中產生出 DDL 指令:


$ imp hr/hr file=exp_emp.dmp show=y log=imp_emp.log


同樣的在執行 imp 之前,也必須要設定環境變數 NLS_LANG 與資料庫字元集相同,否則也會因為字元集的不同導致匯入的資料發生錯誤。


由於 exp 、 imp 是將資料庫的物件匯出成一個 dmp 檔再匯入,所以這中間不會受到作業系統平台,或者是資料庫版本的限制,例如可以將一個在 AIX 平台上、 Oracle 9i 的 Table exp 出來,然後再將其 imp 到 Linux 平台、 Oracle 11g 的資料庫。在跨版本進行 exp 、 imp 時,需要注意的是,使用 exp 必須為比較低版本的,而 imp 可以是同版本或是更高版本的,例如由 Oracle 9i 移轉到 Oracle 10g ,那麼就可以使用 Oracle 9i 的 exp 將資料匯出,再使用 Oracle 10g 的 imp 將資料匯入;但是如果反過來,要將 Oracle 10g 的資料移轉到 Oracle 9i ,那麼就必須使用 Oracle 9i 的 exp ,透過 tnsnames 的方式連線到 Oracle 10g 進行 exp 的動作,然後才可以使用 Oracle 9i 的 imp 將資料匯入,因為高版本 exp 所產生出來的 dmp 檔是無法匯入到低版本的,所以這時候必須用低版本的 exp 來做匯出才行。


exp 、 imp 算是 Oracle 非常早期的工具,目前進行資料庫匯出匯入的動作大多都使用 Datapump ,已經很少使用 exp 、 imp 了。



沒有留言:

張貼留言