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,便於優化器選擇最優執行計划。