DB2數據庫發生死鎖了怎麼辦

鑑於CSDN無故刪除博文,本博客不再更新,暫時遷至http://www.db365.net


DB2數據庫發生死鎖了怎麼辦?

責任編輯:鄭重作者:IT168陳敏   2007-12-18   

【內容導航】

文本TagIBMDB2 DB2


上線之後維護時我們要做的幾件事情

1.
做好定期維護

通過使用如下命令進行維護:
reorg表和索引定期重組
runstats表和索引的統計信息定期更新
rebind 程序包定期重新編譯

2.
日常觀察db2diag.log文件

查看下面鎖升級信息 escalation

2006-02-13-11.05.08.060000-480 E613164H452 LEVEL: Warning PID :2112 TID :3132PROC : db2syscs.exe INSTANCE: DB2 NODE :000 DB : SAMPLE APPHDL :0-170 APPID: *LOCAL.DB2.060213185727FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe:3MESSAGE : ADM5502W The escalationof "35" locks ontable "TEDWAS .

 

STAFF" to lock intent "X" was successful.

 


查看下面死鎖或鎖超時信息DeadLock or Lock timeout

2006-11-08-16.29.11.398155+480 E36235682A521 LEVEL: Error PID :12979 TID :1PROC : db2agent (TESTDB)0 INSTANCE: db2inst1 NODE :000 DB : TESTDB APPHDL :0-288 APPID: 198.132.3.100.57177.061108070923 AUTHID : TESTDB FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe:4MESSAGE : ADM5503E The escalationof "2" locks ontableTESTDB.TEST12"to lock intent "X" has failed.

 

The SQLCODEis "-911".2006-11-08-16.24.39.672914+480 E36100838A502 LEVEL: Error PID :20866 TID :1PROC : db2agent (TESTDB)0 INSTANCE: db2inst1 NODE :000 DB : TESTDB APPHDL :0-1394 APPID: 198.132.3.110.58426.061108075556 AUTHID : TESTDB FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe:4MESSAGE : ADM5503E The escalationof "1" locks ontableTESTDB.

 

TEST11" to lock intent "X" has failed. The SQLCODEis "-952".

 


   
我們可以看到紅字標識出的鎖升級(escalation),鎖等待鎖超時(The SQLCODE is "-911"),程序由於鎖的原因而終止(The SQLCODE is "-952".

3.
觀察命令list applications的輸出

   
查看應用程序的狀態是否有鎖定等待(Lock-wait)狀態出現。
   
   
執行命令 list applications for db sample show detail 得到如下結果

DB2ADMIN db2bp.exe1129*LOCAL.DB2.0711281625170000110348

 

鎖定等待 2006-11-2900:25:52.417899 TEST SAMPLE C:/DB2/NODE0000/SQL00001/ DB2ADMIN db2taskd 1127*LOCAL.DB2.0711281624450000110628

 

連接已完成 2006-11-2900:24:43.909356 TEST SAMPLE C:/DB2/NODE0000/SQL00001/ 。。。。。。。。 DB2ADMIN db2bp.exe1126*LOCAL.DB2.0711281624430000110976 UOW

 

正在等待 2006-11-2900:25:00.559420 TEST SAMPLE C:/DB2/NODE0000/ SQL00001/ 。。。。。。。。

 

   這裏我們可以看到應用程序(1129)正在等待其他應用程序鎖的釋放,而應用程序(1126)正在執行程序,其中11291126分別是應用程序的ID

4.
觀察快照信息(snapshot)的輸出

   
在得到快照信息之前需要將鎖定信息快照開關打開,命令如下

update dbm cfg using dft_mon_lock on(
實例級別)
update monitor switches using lock on(
會話級別,推薦使用

   
之後可以用如下命令取出快照信息

get snapshot for locks on sample 

   
我們可以得到類似信息:

數據庫鎖定快照
數據庫名稱           = SAMPLE
數據庫路徑            = C:/DB2/NODE0000/SQL00001/
輸入數據庫別名            = SAMPLE
掛起的鎖定            = 8
當前已連接的應用程序            = 2
當前正等待鎖定的代理程序數            = 1
快照時間戳記            = 2007-11-29 17:54:13.992157
應用程序句柄            = 54
應用程序標識            = *LOCAL.DB2.071129094306
序號            = 00001
應用程序名            = db2bp.exe CONNECT
授權標識            = DB2ADMIN
應用程序狀態            = 鎖定等待
狀態更改時間            = 2007-11-29 17:50:16.124739
應用程序代碼頁            = 1386
掛起的鎖定            = 4
總計等待時間(毫秒)            = 237867

鎖定列表
鎖定名稱            = 0x030006000500C0020000000052
鎖定屬性            = 0x00000008
發行版標誌            = 0x40000000
鎖定計數            = 1
掛起計數            = 0
鎖定對象名            = 46137349
對象類型            =
表空間名            = IBMDB2SAMPLEREL
表模式            = DB2ADMIN
表名            = TEST1
方式            = X

。。。。。。。。。。。。。。

鎖定名稱            = 0x03000600000000000000000054
鎖定屬性            = 0x00000000
發行版標誌            = 0x40000000
鎖定計數            = 1
掛起計數            = 0
鎖定對象名            = 6
對象類型            = 
表空間名            =  IBMDB2SAMPLEREL
表模式            = DB2ADMIN
表名            =  TEST1 方式 = IX。。。。。。。。。。。。。

   
從上面信息可以看到應用程序(54)正處於鎖定等待狀態,而這個程序所要求的鎖,在快照信息裏有詳細描述(由紅字標識出的),同時我們還可以看到整個數據庫其他程序的鎖定信息,要想得到某個應用程序的鎖定信息,可用如下命令:

get snapshot for locks for application agentid 54 

   
其中54就是應用程序的句柄

5.
注意無效程序(Invalid pakage)的監控 

   
如果系統裏有存儲過程或用戶自定義函數或嵌入C的程序,這些程序包含靜態SQL,在編譯時會生成執行代碼片段,存儲在數據庫的系統表裏,在程序執行時直接調用這些代碼執行。 

   
在系統運行一段時間後,如果發生了表結構變了,索引刪除了,統計信息發生變化了等這些程序所依賴的對象發生變化,那這些執行代碼片段可能會失效或不可用。我們需要對這些程序進行監控,可以用下面命令查詢無效程序(pakage):
select pkgname,valid,last_bind_time from syscat.packages where pkgschema = 'name' and valid != 'Y' 

   
如果狀態(valid)爲N,說明需要重新綁定,如果狀態爲X,說明某些其依賴的對象被刪掉了,需要重新創建那些被依賴的對象(如:表) 

   
要想重新綁定,可以執行下面命令:
rebind package pkgname resolve any 

   
同時DB2還提供一個db2rbind命令,這個命令可以一次綁定所有有效或無效的程序(pakage),命令如下:
db2rbind dbname -l logfile all

6.
監控運行時間長排序次數多讀最多運行頻率高的SQL 

   
要想查看這些SQL,可以通過表函數(DB2 V8)或系統管理視圖(DB2 V9)來實現。 

   
DB2 V9中增加了管理視圖,可以如下使用:

查看執行時間最長的 5 個動態 SQL 語句:

select AVERAGE_EXECUTION_TIME_S , SUBSTR(STMT_TEXT,1,200)AS STMT_TEXTfrom SYSIBMADM.

 

TOP_DYNAMIC_SQLorderby AVERAGE_EXECUTION_TIME_Sdescfetch first5 rowsonly;

 

查看執行頻率最高的 5個動態 SQL 語句:

select NUM_EXECUTIONS, AVERAGE_EXECUTION_TIME_S, STMT_SORTS, SORTS_PER_EXECUTION,

 

SUBSTR(STMT_TEXT,1,200)AS STMT_TEXTfrom SYSIBMADM.

 

TOP_DYNAMIC_SQLORDERBY NUM_EXECUTIONSdescfetch first5 rowsonly;

 

查看排序次數最多的 5個動態 SQL 語句:

select STMT_SORTS, SORTS_PER_EXECUTION, substr(STMT_TEXT,1,200)as STMT_TEXTfrom SYSIBMADM.

 

TOP_DYNAMIC_SQLorderby STMT_SORTSdescfetch first5 rowsonly;

 

   DB2 V8中增加了表函數,可以如下使用:

查看執行時間最長的 5 個動態 SQL 語句:

select TOTAL_EXEC_TIME/NUM_EXECUTIONS, SUBSTR(STMT_TEXT,1,200)

 

AS STMT_TEXTFROMTABLE( SNAPSHOT_DYN_SQL (CAST(NULLASVARCHAR(1)),CAST (NULLASINTEGER)))

 

as SNAPSHOT_DYN_SQLorderby TOTAL_EXEC_TIME/NUM_EXECUTIONSdescfetch first5 rowsonly;

 

查看執行頻率最高的 5個動態 SQL 語句:

select NUM_EXECUTIONS, TOTAL_EXEC_TIME/NUM_EXECUTIONS, STMT_SORTS,

 

STMT_SORTS/NUM_EXECUTIONSas SORTS_PER_EXECUTION,

 

SUBSTR(STMT_TEXT,1,200)AS STMT_TEXTfromTABLE( SNAPSHOT_DYN_SQL (CAST(NULLASVARCHAR(1)),

 

CAST (NULLASINTEGER))) as SNAPSHOT_DYN_SQLORDERBY NUM_EXECUTIONSdescfetch first5 rowsonly;;

 

查看排序次數最多的 5個動態 SQL 語句:

select STMT_SORTS, STMT_SORTS/NUM_EXECUTIONSas SORTS_PER_EXECUTION,

 

substr(STMT_TEXT,1,200)as STMT_TEXTfromTABLE( SNAPSHOT_DYN_SQL (CAST(NULLASVARCHAR(1)),

 

CAST (NULLASINTEGER))) as SNAPSHOT_DYN_SQLorderby STMT_SORTSdescfetch first5 rowsonly;

 

   如果發現了運行成本比較高的SQL,就要來優化這些SQL的執行效率,來降低持有鎖的鎖產生的資源消耗,進一步降低死鎖和鎖等待的產生。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章