2007年5月29日 星期二

將 Oracle 9i export 出的 dump file 匯入指定帳號、指定表格空間

如何將 Oracle 9i export 工具(exp) 輸出的 Oracle binary-format dump file 匯入指定帳號、並指定表格空間?

網路上有不少人提出了這樣奇怪的問題,這個問題很重要嗎?為什麼會有這樣的需求?在我看來有這樣的問題是一件很奇怪的事。

如果是客戶對軟體公司的產品或修補發生這樣的需求,可以推測很可能是軟體公司的開發人員直接將開發平台上的資料庫匯出來給客戶,而不是採用執行SQL Script的方式來更新資料庫中物件的Schema或資料,對很多公司有重要 Oracle 資料庫的 DBA,大概都很難接受這樣的事情,因為根本不曉得匯入的物件是不是有問題,也很難確定匯出的資料,轉到匯入的平台版本是否不會有問題(是否上了相同的修補檔)。萬一不幸匯入中的物件與原資料庫中有相同的物件名稱,又沒注意到一不小心可能就造成大災難了。如果資料庫大的話匯入的工程浩大又費時,當然匯入前要先作完整備份、匯入後要馬上作完整備份比較安全,如果是Archive Log Mode,那一堆的Archive Log 就要思考一下,匯入時是不是要暫時停止 Archive Log 的運作。

Oracle export 及 import 工具是用來轉移 Oracle Database 到另一個平台的工具,如果僅僅是想透過這個工具在不同的帳號和指定的表格空間中轉移,可能會很失望,因為他們不是為這個目的被設計出來的,不信邪,試到鬍鬚白了又打結也一樣。

以下是 Oracle Database Administration Fundamentals II 教材對 export 及 import 工具的說明:

The Export utility provides a simple way for you to transfer data objects between Oracle database, even if they reside on platforms with different hardware and software configurations.

When you run Export against an Oracle database, objects(such as tables) are extracted, followed by their related objects(such as indexes, comments, and grants), if any. The extracted data is written to an Export file, which is an Oracle binary-format dump file that is typically located on disk or tape.

The Import utility reads the object definitions and table data from an Export dump file. It inserts the data objects into an Oracle database.

Import 工具的執行順序過程:

  1. 建立新表格。
  2. 資料匯入表格。
  3. 建立索引。
  4. 匯入Trigger。
  5. 設定新表格上的 constraints。
  6. 建立其它 bimap,function,domain index。

首先使用 Oracle 9i export 和 import 工具有幾個觀念要釐清:

  1. 用來執行 import 工具的版本不能低於 export 版本。
  2. Oracle Export 及 Import 工具沒有任何選項、參數可以指定匯入的表格空間 (Tablespace)。
  3. Import 時會在目的 "資料庫帳號下的表格空間(Tablespace)" 中建立物件,而不是在目的 "帳號預設的表格空間(Tablespace)" 中建立物件。匯入時 import 程式在建立表格時會指定使用的表格空間,而表格空間名稱就是原匯出時的名稱,大部份情況在指定的表格空間不存在時,會改用匯入帳號預設的表格空間,但當表格中有比較特別的資料型態時,則無法使用匯入帳號預設的表格空間建立表格,而造成匯入失敗,這也是最多人搞不清楚的一點。
  4. 表格在表格空間裡並不是不可以被移動的,可以透過簡單的指令移動。
  5. 索引在表格空間裡雖然無法被移動的,但是可以透過簡單的指令重建。

觀念釐清後我們可以利用 export 及 import 工具先將資料庫物件轉移到目標資料庫,再作一些工作來達成目標(指定帳號、並指定表格空間),以下是簡單的步驟:

  1. 建立所需表格空間及調整表格空間的存取權限讓 Oracle Import 工具能正確無誤的執行,匯入到指定的帳號下。imp 中加入INDEXES=N參數、INDEXFILE=index.sql,產生建立索引指令的檔案 index.sql,索引等到表格都搬到正確表格空間再重建。
  2. 若由較低版本資料庫匯出的檔案,可能需要執行一些修正檔(略,自行處理)。
  3. 使用 ALL_TABLES View 查詢那些表格需要被移動。
  4. 使用 表格在表格空間移動的指令。移動指令:ALTER TABLE <table name> MOVE TABLESPACE <tablespace name>
  5. 如果表格中有 LOB 這類資料類型的欄位,則還需將這些欄位的資料移至新的表格空間。查詢 ALL_TAB_COLUMNS View;
  6. 移動LOB 這類資料類型的欄位資移至新的表格空間。移動指令:ALTER TABLE <table name> MOVE LOB(lobseg name) STORE AS (TABLESPACE <>tablespace name);
  7. 編輯 index.sql 檔案中 tablespace 的設定。
  8. 執行 index.sql 重建索引,或自行下指令重建需要移動表格空間的索引。重建索引的指令:ALTER INDEX <index name> REBUILD TABLESPACE <tablespace name>。

步驟 3、4,5、6,7、8 是可以寫成一個PL/SQL程序來執行的(略)。

其它參考資訊-Oracle 10g 如何變更 TABLESPACE NAME:

  1. Oracle 10g 新增指令,可以透過指令變更 TABLESPACE NAME,這和之前的版本比較,舊版本要變更 TABLESPACE NAME 是件浩大的工程。
  2. 指令:ALTER TABLESPACE <tablespace old name> RENAME TO <tablespace new name>;
  3. 資料庫 compatibility level 最低必須設為 10.0.1。
  4. 不能更改 SYSTEM、SYSAUX tablespace 表格名稱。
  5. 不能更改 offline tablespace。
  6. 不能更改 含有 offline datafiles 的 tablespace 名稱。
  7. 更改 tablespace 名稱,不會變更 tablespace identifier。
  8. 更改 tablespace 名稱,不會變更 tablespace 中 datafile 的名稱。

沒有留言: