DB2數(shù)據(jù)庫(kù)鎖的解決方法
Posted on 2008-08-12 16:39 Prayer 閱讀(713) 評(píng)論(0) 編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫(kù),SQL簡(jiǎn)介
鎖是數(shù)據(jù)庫(kù)為了控制并發(fā)數(shù)據(jù)的完整性而引入的機(jī)制,在并發(fā)應(yīng)用中出現(xiàn)鎖現(xiàn)象并不可怕,鎖現(xiàn)象通常分為死鎖和鎖等待兩種情形。
死鎖是因?yàn)閮蓚€(gè)并發(fā)的進(jìn)程或者線程同時(shí)各自占有一個(gè)資源,又需要占有對(duì)方資源,但又都各不相讓造成的,這通常是因?yàn)槌绦蛟诓l(fā)上考慮不周造成的。
不管是死鎖還是鎖等待,數(shù)據(jù)庫(kù)都有相應(yīng)參數(shù)可調(diào),也有相應(yīng)的工具可以捕獲和分析,以下是鎖處理的通常辦法。
查看和更改與鎖相關(guān)的主要數(shù)據(jù)庫(kù)參數(shù)
查看當(dāng)前并發(fā)應(yīng)用
查看和更改快照參數(shù)
獲取快照
使用事件查看器
1. 查看和更改與鎖相關(guān)的主要配置參數(shù)。
CLP方式:
db2 get db cfg
在參數(shù)列表中尋找DLCHKTIME和LOCKTIMEOUT兩個(gè)參數(shù)。
-LOCKTIMEOUT單位是秒,是鎖等待最長(zhǎng)時(shí)間,超過(guò)該時(shí)間仍未獲得鎖,則返回錯(cuò)誤。
設(shè)置提示:
-缺省情況下,LOCKTIMEOUT是-1,意味著鎖等待時(shí)間無(wú)限期,這和實(shí)際應(yīng)用需求一般是不太相符的,需要將其值設(shè)為大于0的一個(gè)數(shù)。
-DLCHKTIME時(shí)間通常要設(shè)得比LOCKTIMEOUT時(shí)間小一些,否則未等發(fā)現(xiàn)死鎖,就會(huì)被以鎖等待超時(shí)而返回錯(cuò)誤。
更改示例(CLP方式)
db2 update db cfg using locktimeout 10
2. 查看當(dāng)前并發(fā)應(yīng)用
CLP方式:
db2 list applications
或db2 list applications show detail
或 db2 list applications for database dbname [ show detail]
該命令可以查看當(dāng)前是否有多個(gè)應(yīng)用在連接著數(shù)據(jù)庫(kù),從而排查是否有并發(fā)的存在。
注意Application Name 和Application Id兩欄,Application Name欄列出了應(yīng)用的名字,db2bp通常意味著目前有CLP在連接數(shù)據(jù)庫(kù),java
3. 查看和更改快照參數(shù)
如果在合理設(shè)置了DLCHKTIME和LOCKTIMEOUT參數(shù)仍然出現(xiàn)鎖現(xiàn)象,可以查看快照或者創(chuàng)建事件監(jiān)控器來(lái)分析原因。要采用快照,首先要打開快照開關(guān)
db2 get monitor switches
輸出中將包含以下參數(shù):
監(jiān)控開關(guān) 數(shù)據(jù)庫(kù)管理器參數(shù) 注釋
BUFFERPOOL DFT_MON_BUFPOOL 緩沖區(qū)的讀寫情況和發(fā)生時(shí)間
LOCK DFT_MON_LOCK 鎖持有,鎖等待,以及死鎖的發(fā)生情況
SORT DFT_MON_SORT Heap的使用情況,排序性能
STATEMENT DFT_MON_STMT 語(yǔ)句起始時(shí)間,語(yǔ)句內(nèi)容
TABLE DFT_MON_TABLE Measure of activity (rows read/written)
UOW DFT_MON_UOW Start/end times, completion status
TIMESTAMP DFT_MON_TIMESTAMP Timestamps
為了觀察快照中的鎖和執(zhí)行語(yǔ)句情況,一般把LOCK和STATEMENT選項(xiàng)設(shè)為ON,也可以酌情把其他開關(guān)打開,示例如下: db2 update monitor switches using lock on statement on
4. 查看快照信息
-查看數(shù)據(jù)庫(kù)管理器級(jí)別快照信息
db2 get snapshot for dbm
-查看數(shù)據(jù)庫(kù)級(jí)別快照信息
db2 get snapshot for database on dbname
-查看應(yīng)用級(jí)別快照信息
db2 get snapshot for application agentid appl-handler
注:appl-handler可以從list applicaitions的輸出中得到
-查看表級(jí)別快照信息
db2 get snapshot for tables on dbname
注:需要把tables快照開關(guān)設(shè)為ON才會(huì)有作用
-查看鎖快照信息
db2 get snapshot for locks on dbname
或
db2 get snapshot for locks on for application agentid appl-handler
-查看動(dòng)態(tài)sql語(yǔ)句快照信息
db2 get snapshot for dynamic sql on dbname
5.使用事件查看器
可以使用時(shí)間查看器收集鎖事件,SQL語(yǔ)句事件,從而根據(jù)事件分析鎖原因。
事件類型
使用事件監(jiān)控器,首先要選定所關(guān)注的事件類型,DB2中有很多事件類型,可以用于鎖分析的通常會(huì)用到以下三種:
DEADLOCKS
DEADLOCKS WITH DETAILS
STATEMENTS
步驟:
-創(chuàng)建事件監(jiān)控器
create event monitor evmname for eventtype write to file ‘directory’
例:create event monitor mymonitor for deadlocks, statements
write to file ‘c:\temp’
-把事件監(jiān)控器打開
接上例:
set event monitor mymonitor state 1
注:1為打開,0為關(guān)閉
事件監(jiān)控器開始工作,當(dāng)所有應(yīng)用斷掉連接后,將事件記錄下來(lái)
-查看事件細(xì)節(jié)
db2evmon –path ‘c:\temp’
附注參考說(shuō)明:事件監(jiān)控器和快照的輸出詳細(xì)內(nèi)容說(shuō)明,請(qǐng)參考DB2信息中心和IBM網(wǎng)站相關(guān)redbook