DB2數據導入導出的小結

 

Db2的數據遷移,最經常使用的就是導入導出功能,而導入導出的命令貌似簡單,實則內含玄機變幻無窮,這兒就工做中經常使用到的命令,小結了一下。數據庫

 

1、數據導入導出基礎的格式知識ide

DEL:界定的ASCII文件,行分隔符和列分隔符將數據分開。(異機)測試

ASC:定長的ASCII文件,行按照行分割符分開,列定長。大數據

PC/IXF:只能用來在db2之間導數據,根據類型數字值被打包成十進制或者二進制,字符被保存爲ASCII,只保存變量已經使用了的長度,文件中包括表的定義和表的數據。(本機)unix

WSF:工做表方式導入導出,這種格式的文件類型用的比較少。rest

Db2中對不一樣的數據導入導出方式,支持不一樣的文件類型意的。blog

 

關於3種導入導出操做進行簡單的介紹:索引

export:導出數據,支持IXF,DEL或WSF內存

import:導入數據,能夠向表中導入數據,支持上面提到的4種文件類型。    文檔

load:導入數據,功能和import基本相同。支持以上說的幾種文件類型。

 

關於Export 

命令格式:export to filename of filetype select x from xx where ;

幾個須要注意的問題:

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'

相關文章
相關標籤/搜索