天天看點

db2鎖等待模拟和事件監控

1、關于鎖等待

當兩個應用程式競争資源時,第一個應用程式在資源上加鎖後,

第二個應用程式企圖加鎖時發現

希望增加的鎖與資源現有的鎖不相容

,就出現

鎖等待

第二個應用程式挂起。為捕獲鎖等待事件,MON_LOCKWAIT 不能設定為 NONE,

當鎖等待時間超過 MON_LW_THRESH 指定的值時則事件螢幕捕獲該事件

要觀察鎖等待,設定這個參數,讓鎖一直等待着,便于分析

db2 update db cfg for bkdb1 using LOCKTIMEOUT -1

鎖等待模拟

db2 connect to dbname模拟兩個APP

2.1  APP1更新資料

401号APP

[[email protected] ~]$ db2 connect to bkdb1

   Database Connection Information

 Database server        = DB2/LINUXX8664 9.7.2

 SQL authorization ID   = DB2INST1

 Local database alias   = BKDB1

[db2i[email protected] ~]$ db2 +c "update tab1 set name='xxx' where id=1"

DB20000I  The SQL command completed successfully.

未送出

2.2  APP2更新同一行資料

402号APP

[[email protected] ~]$ db2 connect to bkdb1

   Database Connection Information

 Database server        = DB2/LINUXX8664 9.7.2

 SQL authorization ID   = DB2INST1

 Local database alias   = BKDB1

[db2i[email protected] ~]$ db2 +c "update tab1 set name='yyy' where id=1"

2.3 

等待資訊

[[email protected] ~]$ db2 "select count(*) from lockwaitevm"

1          

-----------

          4

  1 record(s) selected.

 使用db2pd檢視APP狀态

[[email protected] ~]$ db2pd -apinfo 401 -db bkdb1

Database Partition 0 -- Database BKDB1 -- Active -- Up 0 days 00:02:00 -- Date 11/18/2016 16:20:32

Application :

  Address :                0x0000000201030080

  AppHandl [nod-index] :   401      [000-00401]

  TranHdl :                9         

  Application PID :        21127     

  Application Node Name :  aspDB01                                 

  IP Address:              n/a                                     

  Connection Start Time :  (1479457188)Fri Nov 18 16:19:48 2016

  Client User ID :         db2inst1

  System Auth ID :         DB2INST1

  Coordinator EDU ID :     105       

  Coordinator Partition :  0         

  Number of Agents :       1         

  Locks timeout value :    NotSet

  Locks Escalation :       No

  Workload ID :            1         

  Workload Occurrence ID : 2         

  Trusted Context :        n/a

  Connection Trust Type :  non trusted

  Role Inherited :         n/a     

  Application Status :     UOW-Waiting             

  Application Name :       db2bp               

  Application ID :         *LOCAL.db2inst1.161118081948                                    

  ClientUserID :           n/a

  ClientWrkstnName :       n/a

  ClientApplName :         n/a

  ClientAccntng :          n/a

  CollectActData:          N  

  CollectActPartition:     C  

  SectionActuals:          N  

--------------------------------------------------------------------------------

[[email protected] ~]$ db2pd -apinfo 402 -db bkdb1

Database Partition 0 -- Database BKDB1 -- Active -- Up 0 days 00:02:03 -- Date 11/18/2016 16:20:35

Application :

  Address :                0x0000000200FD0080

  AppHandl [nod-index] :   402      [000-00402]

  TranHdl :                10        

  Application PID :        20949     

  Application Node Name :  aspDB01                                 

  IP Address:              n/a                                     

  Connection Start Time :  (1479457194)Fri Nov 18 16:19:54 2016

  Client User ID :         db2inst1

  System Auth ID :         DB2INST1

  Coordinator EDU ID :     106       

  Coordinator Partition :  0         

  Number of Agents :       1         

  Locks timeout value :    NotSet

  Locks Escalation :       No

  Workload ID :            1         

  Workload Occurrence ID : 3         

  Trusted Context :        n/a

  Connection Trust Type :  non trusted

  Role Inherited :         n/a     

Application Status :     Lock-wait  

  Application Name :       db2bp               

  Application ID :         *LOCAL.db2inst1.161118081954                                    

  ClientUserID :           n/a

  ClientWrkstnName :       n/a

  ClientApplName :         n/a

  ClientAccntng :          n/a

  CollectActData:          N  

  CollectActPartition:     C  

  SectionActuals:          N  

  List of active statements :

   *UOW-ID :          1         

    Activity ID :     1         

    Package Schema :  NULLID  

    Package Name :    SQLC2H21

    Package Version :

    Section Number :  203       

    SQL Type :        Dynamic

    Isolation :       CS

    Statement Type :  DML, Insert/Update/Delete     Statement :       update tab1 set name='yyy'     where id=1

可以看到第2号APP處于lock-wait狀态

 Blocked/Blocking Agent Chain                                                                                                                           |

-------------------------------------------------------------|

|   401->402  

不過以上資訊很難抓取到 ;

下面我們通過事先建好的鎖事件監控器檢視鎖等待資訊 

提取監控資料

3.1  重新整理關閉事件監控

[[email protected] ~]$ db2 flush event monitor lockwaitevm

DB20000I  The SQL command completed successfully.

[[email protected] ~]$ db2 set event monitor lockwaitevm state 0

DB20000I  The SQL command completed successfully.

 3.2 

格式化監控表

[[email protected] ~]$ db2 "call EVMON_FORMAT_UE_TO_TABLES ( 'LOCKING', NULL, NULL, NULL, NULL, NULL, 'RECREATE_FORCE', -1, 'SELECT * FROM lockwaitevm ORDER BY event_timestamp')"

  Return Status = 0

3.3  檢視事件

[[email protected] ~]$ db2 "select substr(event_id,1,2) id,substr(XMLID,1,30) as xml_id,char(EVENT_TYPE,12) type from lock_event"

ID XML_ID                         TYPE        

-- ------------------------------ ------------

11 db2LockEvent_11_

LOCKWAIT

_2016- LOCKWAIT    

  1 record(s) selected.

lock_event中有一條記錄,事件類型就是

LOCKWAIT

3.4  檢視事件參與者

[[email protected] ~]$ db2 "select substr(XMLID,1,25) as xml_id,

 substr(PARTICIPANT_NO,1,3) as p_no,

 PARTICIPANT_TYPE as p_type,

 substr(PARTICIPANT_NO_HOLDING_LK,1,3) as p_lk,

 substr(APPLICATION_HANDLE,1,3) as p_name,

 substr(TABLE_NAME,1,1) tabname,

substr(lock_mode,1,3) lock_mode,

substr(LOCK_MODE_REQUESTED,1,3) LOCK_MODE_REQ,substr(LOCK_OBJECT_TYPE,1,3) LOCK_OBJECT_TYPE from LOCK_PARTICIPANTS"

XML_ID   P_NO P_TYPE  P_LK P_NAME TABNAME LOCK_MODE LOCK_MODE_REQ LOCK_OBJECT_TYPE

------------------------- ---- ---------- ---- ------ ------- --------- -------

db2LockEvent_11_

LOCKWAIT

_ 1    Requester  2    402    T    5   5    ROW             

db2LockEvent_11_

LOCKWAIT

_ 2    Owner      -    401    -    -    -     -               

  2 record(s) selected.

LOCK_PARTICIPANTS中有兩條記錄

一條記錄的 PARTICIPANT_TYPE 為 Requester,應用程式句柄為402 即 APP2,LOCK_OBJECT_TYPE為ROW,表示為行鎖,

LOCK_MODE_REQUESTED

為5,表示請求的鎖類型為排他鎖(X 鎖)

而行上目前加的鎖 LOCK_MODE 為 5 表示排他鎖(X 鎖)

表 LOCK_PARTICIPANTS 另一條記錄 PARTICIPANT_TYPE 為 Owner,應用程式句柄為401 即 APP1。這意味着 APP1 為鎖的擁有者,在行上持有了 X 鎖導緻應用程式2鎖等待

3.5  檢視事件活動

查詢事件參與者的活動:

[[email protected] ~]$ db2 "SELECT PARTICIPANT_NO, ACTIVITY_TYPE, substr(STMT_TEXT,1,40) sql_text FROM LOCK_PARTICIPANT_ACTIVITIES"

PARTICIPANT_NO ACTIVITY_TYPE SQL_TEXT                                

-------------- ------------- ----------------------------------------

             1 current       update tab1 set name='yyy' where id=1   

             1 past          update tab1 set name='xxx' where id=1   

  2 record(s) selected.

很明顯,past就是已經執行的指令 持有鎖,阻塞了current目前執行的指令,導緻current等待;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29023300/viewspace-2128771/,如需轉載,請注明出處,否則将追究法律責任。

轉載于:http://blog.itpub.net/29023300/viewspace-2128771/