鑑於CSDN無故刪除博文,本博客不再更新,暫時遷至http://www.db365.net
責任編輯:鄭重作者:IT168陳敏 2007-12-18
【內容導航】
上線之後維護時我們要做的幾件事情
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 ontable“TESTDB.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 ontable“TESTDB.
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)正在執行程序,其中1129和1126分別是應用程序的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的執行效率,來降低持有鎖的鎖產生的資源消耗,進一步降低死鎖和鎖等待的產生。