db2 load選項


db2 load使用

最近有個好朋友因為load問題導致了生產故障,所以特意寫篇文章總結一下load的用法及注意事項。

1.load概述

數據的導入方法有insert,import和load三種,其中load不需要寫日志(或很少日志),不做檢查約束和參照完整性約束,不觸發Trigger,鎖的時間比較短,因此特別適合大數據量的導入。

2.load的4個階段

load過程分為4個階段:load/build/delete/index copy。load階段是將源文件parser成物理數據存儲的格式,直接裝入到頁中,而不通過db2引擎,load階段會檢查表定義,違背定義的數據不會裝入到表中。build階段建議索引(如果裝入表有索引的話),會檢查唯一性約束,違背了唯一性的數據會在delete階段刪除。index copy階段將index數據從指定的臨時表空間拷貝到初始的表空間里,index copy只適應於allow read access場景。load的4個階段會記錄在messages文件里。

3.online and offline load

缺省情況下,load過程不允許其他應用訪問表,即allow no access,或叫offline load(離線加載)。Allow read access,或叫online load(在線加載),只有在load ...insert into的時候才允許使用,其他應用讀到的數據是加載前的數據,load ... replace into會將數據先刪除,再load,只能是離線加載。

4.load舉例

此例中,要將calpar.del文件數據導入到表calpar中,calpar表的第一個字段是primary key,最后一個字段定義為非空的數字型。load命令如下:

load from calpar.del of del modified by dumpfile=/dump.fil warningcount 100 messages par.msgs inser into calpar for exception calpar.exp

此命令會產生四個輸出,calpar為目標表,messages記錄load的4個階段,dumpfile記錄違背表定義的數據,exception table記錄違背唯一性約束的數據(exception table需要在load之前創建,表定義為目標表+timestamp type column+clob type column)。本例中,第2行和第5行違背了表定義,因此存到了dumpfile文件;第4行和第7行違背了唯一性約束,存到了exception table里;剩余正常的數據存到了目標表里。

5. load表的狀態

load可能出現的幾種狀態,某一時刻可能會同時處於幾種狀態。只有當表是normal狀態時,表才能進行正常的增刪改查操作。

normal: 正常狀態

set integrity pending: 如果目標表有check約束或reference約束,那么Load后此表處於set integrity pending,表明表有約束還未檢查,稍后解釋。

load in progress:load正在數據加載過程中。

load pending:數據提交前出現了故障,需要通過load..terminate,load..replace或load..restart解除暫掛狀態

read access only:目標表數據是可以讀的,當load時指定了allow read access,那表就會處於read access only狀態

unavailable:表可能被刪除了或從backup中恢復了。

unknown:通過load..query命令無法得知表的狀態。

 

可以通過load..query命令查看表的狀態,

(1).當表處於load pending的時候,需要檢查pending的原因,然后通過load..terminate終止load操作,或通過load..replace將表數據清空,或通過load..restart重啟load操作。記住不要刪除load的臨時數據文件。load pending的原因很多,如表空間沒有足夠的空間等。

(2).當表處於set integrity pending狀態的時候,意味着要求用戶去檢查數據的一致性(check constraint和reference constraint)。可通過 set integrity for <table_name>immediate checked將set integrity pending去掉。

(3).load..replace會將數據先清空,再load數據。如果中間出現故障,那么通過load..terminate命令后,表里的數據會變空,因此建議load之前進行數據庫備份或單表備份。

 

6. load的COPY選項

 

COPY可以理解為備份,主要針對前滾恢復,即當數據庫處於歸檔日志情況下。由於load不記日志,需要備份才能進行恢復。

Load支持三種COPY選項,COPY NO(缺省),COPY YES,和NONRECOVERABLE。

COPY NO :此選項會導致load表所在的表空間處於backup pending狀態,可以讀數據,但不能對表進行增刪改。load操作一旦開始,表就會處於backup pending狀態,即使終止Load,也不會使表空間脫離此狀態。load完成后,需要進行表空間backup。

COPY YES: 此選項會將load變化的數據進行自動備份。在前滾恢復階段(rollforward),會使用這個備份重建load過程產生的數據。

NONRECOVERABLE:此選項表明此表是不能通過rollforward恢復的,當rollforward完成后,此表只能被刪除或從備份介質中恢復。此選項不會使表空間處於backup pending狀態,也不會產生數據的備份。

我的朋友前幾天因為在正常交易時間load數據,造成了表空間處於backup pending狀態,交易系統只能查不能更新,盡管發現問題后立即終止load,但由於表空間很大,backup花了將近1個半小時,嚴重影響了交易的正常運行,一個失誤可能會導致年終獎泡湯。他在測試系統測試過沒問題,但由於測試系統使用的是循環日志,而生產中利用的是歸檔日志。

 

7. load replace快速清空大表

對於大表數據的清空,如果用delete,由於會產生大量的日志,導致效率很慢,而且容易出現log full。可以考慮用load from /dev/null of del replace into

(Unix/Linux) 或者load from empty.del of del replace into (Windows,empty.del是一個空的文本文件即可) 

 

 

8. load總結

load的步驟可以總結如下:

(1)創建表和索引

 (2) 建異常表(exception table)

 (3) 備份db或tablespace

 (4) load ..dumpfile ..messages ..exception

 (5) 驗證dumpfile,messages和異常表

 (6) backup tablespace if logretain=on and copy NO

 (7) set integrity (if table has check or reference constraints)

 (8) 更新statistics,便於優化器選擇最優執行計划。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM