診斷DB2資料庫鎖的問題

2021-04-18 10:47:25 字數 2920 閱讀 6640

簡介鎖是資料庫為了控制併發資料的完整性而引入的機制,在併發應用中出現鎖現象並不可怕,鎖現象通常分為死鎖和鎖等待兩種情形。

死鎖是因為兩個併發的程序或者執行緒同時各自占有乙個資源,又需要占有對方資源,但又都各不相讓造成的,這通常是因為程式在併發上考慮不周造成的。

鎖等待則是資料庫中最普通的情況,一各應用使用資料期間必然要加鎖,防止其他程序或應用破壞資料,其他程序或應用在此期間不得不等待前乙個應用 釋放鎖。鎖等待時間引數是可調的,但要視實際應用情況而定,比如在網路環境中,複雜應用環境,或者對實時性要求不高的環境中,可以將鎖等待時間調大一些, 有些情況要調小一些。鎖等待不同於死鎖,死鎖屬於程式併發不當,需要調整程式併發機制,鎖等待則屬於效能問題,可能需要調整程式的sql語句。

不管是死鎖還是鎖等待,資料庫都有相應引數可調,也有相應的工具可以捕獲和分析,以下是鎖處理的通常辦法。

檢視和更改與鎖相關的主要資料庫引數

檢視當前併發應用

檢視和更改快照引數

獲取快照

使用事件檢視器

1. 檢視和更改與鎖相關的主要配置引數。

clp方式:

db2 get db cfg

在引數列表中尋找dlchktime和locktimeout兩個引數。

-dlchktime 單位是毫秒,是db2檢查死鎖的間隔時間,假設該值為10000ms,則意味著每隔10秒鐘檢查一下當前資料庫中有無死鎖存在,如有死鎖,會選擇回滾其中的某乙個事務,讓另外乙個事務完成交易。

-locktimeout單位是秒,是鎖等待最長時間,超過該時間仍未獲得鎖,則返回錯誤。

-預設情況下,locktimeout是-1,意味著鎖等待時間無限期,這和實際應用需求一般是不太相符的,需要將其值設為大於0的乙個數。

-dlchktime時間通常要設得比locktimeout時間小一些,否則未等發現死鎖,就會被以鎖等待超時而返回錯誤。

更改示例(clp方式)

db2 update db cfg using locktimeout 10

2. 檢視當前併發應用

clp方式:

該命令可以檢視當前是否有多個應用在連線著資料庫,從而排查是否有併發的存在。

通過排查併發應用從而消除測試中不必要的鎖現象。

3. 檢視和更改快照引數

如果在合理設定了dlchktime和locktimeout引數仍然出現鎖現象,可以檢視快照或者建立事件監控器來分析原因。

要採用快照,首先要開啟快照開關

db2 get monitor switches

輸出中將包含以下引數:

監控開關 資料庫管理器引數 注釋

bufferpool dft_mon_bufpool 緩衝區的讀寫情況和發生時間

lock dft_mon_lock 鎖持有,鎖等待,以及死鎖的發生情況

sort dft_mon_sort heap的使用情況,排序效能

statement dft_mon_stmt 語句起始時間,語句內容

table dft_mon_table measure of activity (rows read/written)

uow dft_mon_uow start/end times, completion status

timestamp dft_mon_timestamp timestamps

為了觀察快照中的鎖和執行語句情況,一般把lock和statement選項設為on,也可以酌情把其他開關開啟,示例如下:

db2 update monitor switches using lock on statement on

4. 檢視快照資訊

-檢視資料庫管理器級別快照資訊

db2 get snapshot for dbm

-檢視資料庫級別快照資訊

db2 get snapshot for database on dbname      

-檢視應用級別快照資訊

-檢視表級別快照資訊

db2 get snapshot for tables on dbname  

注:需要把tables快照開關設為on才會有作用

-檢視鎖快照資訊

db2 get snapshot for locks on dbname

或 -檢視動態sql語句快照資訊

db2 get snapshot for dynamic sql on dbname

5.使用事件檢視器

可以使用時間檢視器收集鎖事件,sql語句事件,從而根據事件分析鎖原因。

事件型別

使用事件監控器,首先要選定所關注的事件型別,db2中有很多事件型別,可以用於鎖分析的通常會用到以下三種:

deadlocks

deadlocks with details

statements

步驟:

-建立事件監控器

create event monitor evmname for eventtype write to file 『directory』

例:create event monitor mymonitor for deadlocks, statements

write to file 『c:/temp』

-把事件監控器開啟

接上例:

set event monitor mymonitor state 1

注:1為開啟,0為關閉

事件監控器開始工作,當所有應用斷掉連線後,將事件記錄下來

-檢視事件細節

db2evmon –path 『c:/temp』

《system monitor guide and reference》

診斷DB2資料庫鎖的問題

診斷db2資料庫鎖的問題 簡介 鎖是資料庫為了控制併發資料的完整性而引入的機制,在併發應用中出現鎖現象並不可怕,鎖現象通常分為死鎖和鎖等待兩種情形。死鎖是因為兩個併發的程序或者執行緒同時各自占有乙個資源,又需要占有對方資源,但又都各不相讓造成的,這通常是因為程式在併發上考慮不周造成的。鎖等待則是資料...

DB2鎖表問題

主要分兩步驟 獲取事物id及正在對該錶進行操作的sql 終止該事物。一 獲取事物id和sql 方法一 已知表名 獲取事物id db2 select distinct agent id from sysibmadm.snaplock where tabnme tabname with ur 檢視正在鎖...

建立 DB2 資料庫

可以使用 tivoli privacy manager 資料庫建立程式或使用資料庫產品介面可以建立 tivoli privacy manager 資料庫 表和配置資料庫。使用 db2 資料庫建立程式 使用 tivoli privacy manager 資料庫建立程式來建立 tivoli privac...