1. 程式人生 > >Db2 檔案匯入匯出常見命令總結 EXPORT IMPORT LOAD

Db2 檔案匯入匯出常見命令總結 EXPORT IMPORT LOAD

轉載自 myfriend2010 51cto 上的 Db2 檔案匯入匯出常見命令總結


Db2 的資料遷移,最常用的就是匯入匯出功能,而匯入匯出的命令貌似簡單,實則內含玄機,千變萬化,稍不留神,則錯誤百出,這兒就工作中常用到的命令,總結了一下,分享給大家!歡迎大家踴躍拍磚!J


當然在這以前,我覺得有必要提及一點關於匯入匯出基礎的知識! 
DEL:界定的ASCII檔案,行分隔符和列分隔符將資料分開。
ASC:定長的ASCII檔案,行按照行分割符分開,列定長。
PC/IXF:只能用來在db2之間導資料,根據型別數字值被打包成十進位制或者二進位制,字元被儲存為ASCII,只儲存變數已經使用了的長度,檔案中包括表的定義和表的資料。
WSF:工作表方式匯入匯出,這種格式的檔案型別用的比較少。
Db2中對不同的資料匯入匯出方式,支援不同的檔案型別,這裡個人覺得很有必要注意的。
檔案型別        Import        export        load
-------------------------------------------------------
定界           支援           支援           支援
非定界         支援           不支援         支援
Ixf           支援           支援           支援
Wsf工作表      支援           支援           不支援


關於3種匯入匯出操作進行簡單的介紹:
export:匯出資料,支援IXF,DEL或WSF
import:匯入資料,可以向表中匯入資料,支援上面提到的4種檔案型別。    
load:匯入資料,功能和import基本相同。支援以上說的幾種檔案型別。


關於Export 

這個其實比較簡單,沒啥好說的,一般命令:export to filename of filetype select x from xx where ;就ok了,這裡需要注意的是:

1.    關於不同字符集的匯出

MODIFIED BY CODEPAGE=
Exprot to filename.del for del MODIFIED BY   CODEPAGE=1386 select … from …where …;
這裡,在資料從資料庫倒出來的時候就會做一個數據庫內碼表的轉換

2.時間欄位格式化的

MODIFIED BY  TIMESTAMPFORMAT="yyyy-mm-dd hh:mm:ss tt"
例:Exprot to filename.del for del MODIFIED BY  TIMESTAMPFORMAT="yyyy-mm-dd hh:mm:ss tt" select … from …where …;


關於Import



1.Import模式的介紹

CREATE/INSERT/INSERT_UPDATE/REPLACE/REPLACE_CREATE
CREATE :首先建立目標表和它的索引,然後將資料匯入到新表中。該選項惟一支援的檔案格式是 PC/IXF。還可以指定新表所在表空間的名稱
INSERT :將匯入的資料插入表中。目標表必須已經存在。 
INSERT_UPDATE :將資料插入表中,或者更新表中具有匹配主鍵的行。目標表必須已經存在,並且定義了一個主鍵。 
REPLACE :刪除所有已有的資料,並將匯入的資料插入到一個已有的目標表中。 
REPLACE_CREATE :如果目標表已經存在,則匯入實用程式刪除已有的資料,並插入新的資料,就像 REPLACE 選項那樣。如果目標表還沒有定義,那麼首先建立這個表以及它的相關索引,然後再匯入資料。正如您可能想像的那樣,輸入檔案必須是 PC/IXF 格式的檔案,因為那種格式包含對匯出表的結構化描述。如果目標表是被一個外來鍵引用的一個父表,那麼就不能使用 REPLACE_CREATE。 

2.    批量提交

COMMITCOUNT,保證insert的資料在COMMITCOUNT以後進行一次commit,這對於大資料量的匯入檔案來說是一個不錯的方法,
例:Import from filename of del COMMITCOUNT 50000 insert into tabname;

3.    批量插入

MODIFIED BY COMPOUND把檔案中的 COMPOUND 行記錄作為一組一起匯入,這個操作可以和上邊的批量提交一起使用,比較理想。
例:Import from filename of del MODIFIED BY COMPOUND =50 insert into tabname;

4.    匯入記錄限制

ROWCOUNT:只匯入rowcount 條資料,有時候,業務邏輯需要只匯入部分資料,那麼ROWCOUNT是一個不錯的選擇,只是在我的測試中ROWCOUNT一直沒有起過作用,呵呵,誰熟悉這裡,幫我完善下。
例:Import from filename of del ROWCOUNT 10000 insert into tabname;

5.    匯入起點

RESTARTCOUNT:從匯入檔案的第RESTARTCOUNT條記錄開始匯入
例:Import from filename of del RESTARTCOUNT 55 ROWCOUNT 10000 insert into tabname;--從55條開始,匯入10000條資料
6.    有警告資料的條數限制
WARNINGCOUNT:當匯入的資料中,有警告或錯誤(例如型別不匹配,列不對應等造成的)並且條數超過WARNINGCOUNT是就會停止import。
例:Import from filename of del WARNINGCOUNT 10 insert into tabname;

7.    禁止發出行警告

MODIFIED BY NOROWWARNINGS
例:Import from filename of del MODIFIED BY NOROWWARNINGS WARNINGCOUNT 10 insert into tabname;

8.    LOB 檔案

LOBS FROM :指出LOB的路徑
例:Import from filename of del LOBS FROM ‘/home’ MODIFIED BY NOROWWARNINGS WARNINGCOUNT 10 insert into tabname;

9.    對於自增序列(GENERATED ALWAYS)

建議不要對自增序列的表進行import操作,因為import對於自增序列,只有MODIFIED BY  IDENTITYIGNORE和MODIFIED BY IDENTITYMISSING的2中操作,這2中操作都會改變自增序列的原值,這樣如果匯出表和表之間有基於自增序列的關聯關係的話,就失去了資料本身的意義,所以建議儘量少用基於import的自增表的操作,那該怎麼做?可以用load老代替import,我們下來在load的操作中會講到!


關於Load



1. 字串間隔,列間隔,小數點表示

CHARDEL/COLDEL/DECPT
例:LOAD CLIENT FROM 'F:\s1.del' OF DEL MODIFIED BY CHARDEL(COLDEL=   DECPT?  INSERT INTO "DB2ADMIN"."ZXTABLES"


2.資料庫記錄中存在換行符,導致資料無法裝入的情況

MODIFIED BY DELPRIORITYCHAR
Db2預設load優先順序策略為,record delimiter, character delimiter, column delimiter,這樣record delimiter得優先順序最高,所以原始檔案如果有換行的話load就認為是新的record,如果使用者在某些情況下行裡面包含了換行符(比如論壇裡面的一條帖子,不可能把換行符刪掉的),就必須用delprioritychar改變預設的優先級別,確保""之間的資料不管有沒有換行符都被認為是同一條記錄
例:LOAD CLIENT  FROM 'F:\s1.del' OF DEL MODIFIED BY DELPRIORITYCHAR  INSERT INTO DB2ADMIN.ZXTABLES


3.load後表空間暫掛的處理

Copy YES/ NONRECOVERABLE
對於DMS表空間,load預設為copy NO 模式,此模式下,load完成後,表空間會處於暫掛狀態,這時候只能查表中的資料,需要對錶空間進行一次備份,才可以對錶進行update、insert等操作,那麼我們可以使用如上2個命令,對於Copy YES,load完成以後會自動進行一次備份操作;NONRECOVERABLE 指出load不可恢復,此命令符不會產生表空間暫掛,也不會自動進行表空間備份,但是他有一個缺點就是,不能恢復,當資料庫進行回滾的時候,不能還原,危險等級還是比較高一點,不過個人覺得也NONRECOVERABLE比較實用。


例:LOAD CLIENT FROM 'F:\s1.del' OF DEL INSERT INTO DB2ADMIN.ZXTABLES NONRECOVERABLE
LOAD CLIENT FROM 'F:\s1.del' OF DEL INSERT INTO DB2ADMIN.ZXTABLES COPY YES

4. load IXF型別檔案到多分割槽資料庫



partitioned db configmode load_only_verify_part part_file_location


當資料在2個不同數量節點的資料庫之間移動,如果還想使用load來進行IXF的資料裝載就比較棘手了,當時查遍IBM的官方文件均無所獲,正鬱郁不安時,狼出現了,給支了一招,現分享給大家。
首先,把ixf檔案複製和分割槽數量相同的檔案,並字尾.000(分割槽號),
比如,2個分割槽,那麼我需要把原來的a.ixf,拷貝2個,並命名為a.ixf.000以及a.ixf.001
然後,load from staff.ixf of ixf replace into t1 partitioned db configmode load_only_verify_part part_file_location xxxx(part_file_location為a.ixf.000所在的目錄),當然如果在unix下的話,可以通過ln –s 來做一個連線也行。


5. 對於自增序列(GENERATED ALWAYS)

MODIFIED BY IDENTITYOVERRIDE:此引數可以理解為,採用檔案load檔案中的自增值做為表自增序列的值,這樣就能保證對於自增序列有業務意義,或者關聯邏輯(主外來鍵關聯)的情況下保證資料的一致,個人對此命令屢試不爽


例:  LOAD CLIENT FROM 'F:\s1.del' OF DEL MODIFIED BY IDENTITYOVERRIDE INSERT INTO DB2ADMIN.ztables;


6. 對於自增序列(GENERATED by default)

GENERATED by default可以直接通過一般的匯入方式載入資料,不過有時候會有一點點小問題,自增序列沒有進行分配,也就是說,原來表有50條記錄,自增序列的下一次分配值為50,當你已經匯入了1000條記錄進去了,然後發現自增序列的下一次分配值還是為50,這種事不經常發生,但是偶爾會發生一次,比較鬱悶的是,當表繼續插入資料的時候,下一次分配就會發生衝突,尤其是如果自增建為主鍵的時候,會違反唯一約束。
解決辦法:首先找到這個序列分配的最大值,select max(id) from tablea;
然後用下邊這個命令,alter table tablea alter column restart  with max(id)+1


7.ROWCOUNT/WARNINGCOUNT

  這個同IMPORT


8.terminate,restart
如果load的過程中出了點故障,比如連線被force掉了等,這時連線查詢表資料會報錯SQL0668N,原因碼3,這時可以通過帶有terminate的load命令來進行處理!
LOAD CLIENT FROM 'F:\s1.del' OF DEL terminate INTO DB2ADMIN.ztables;


9. set integrity 命令

如果表上有約束,那麼給表load資料以後,一般連線表的時候都會報錯,SQL0668N,原因碼1,這說明該表處於“設定完整性暫掛無訪問”狀態,那麼需要如下命令來操作。


Set integrity for schema.tablename immediate checked;


10.提高匯入匯出速度的資料庫引數

CONFIGURATION:應用程式堆大小,該引數指示可由Backup,restore,load及裝入恢復應用程式同事使用的最大記憶體量,看帖子上有介紹,這個值可以設定為10000*cpu數量。
DB2 UPDATE DATABASE CONFIGURATION USING UTIL_HEAP_SZ 113486




呵呵,暫時就寫這麼多了,歡迎大家繼續補充。


由於時間比較緊張,在語言組織上有點凌亂,請大家見諒!