DB2 9.1 依賴 db2cos 腳本調用 db2pd 收集鎖、事務、應用、語句緩存信息,再通過 db2pdcfg 註冊鎖超時事件觸發腳本。缺點顯而易見:
db2pd 輸出碎片化,關聯分析耗時;僅需兩步即可啟用自動鎖超時報告:
db2set DB2_CAPTURE_LOCKTIMEOUT=ON
db2stop && db2start
報告自動生成於 DIAGPATH 目錄,文件名格式:db2locktimeout.dbpartition.agentid.timestamp。報告包含四大板塊:
預設報告僅顯示持有者當前 SQL。若需查看持有者事務內已執行的所有 SQL(含導致 X 鎖的 UPDATE),需創建帶 DETAILS HISTORY 的死鎖事件監視器:
db2 "CREATE EVENT MONITOR evmon_dl FOR DEADLOCKS WITH DETAILS HISTORY WRITE TO FILE '/path/to/evmon'"
db2 "SET EVENT MONITOR evmon_dl STATE 1"
再次觸發鎖超時後,報告新增 List of Inactive SQL Statements from current UOW 區段,按執行順序列出持有者事務內所有歷史 SQL,精準定位加鎖語句。
LOCKTIMEOUT=10:db2sampl && db2 "UPDATE DB CFG FOR SAMPLE USING LOCKTIMEOUT 10"db2 +c "UPDATE EMPLOYEE SET SALARY=SALARY*1.02"(持有 X 鎖,未提交)db2 +c "UPDATE EMPLOYEE SET BONUS=SALARY*0.1 WHERE JOB='MANAGER'"(10 秒後超時)DIAGPATH 下報告,結合事件監視器歷史 SQL 即可見 Session 1 的 UPDATE 為根因。DETAILS HISTORY 監視器對所有應用生效,建議平時僅開啟 DB2_CAPTURE_LOCKTIMEOUT,排查疑難案例時臨時啟用事件監視器。DB2 9.5 將鎖超時分析從「專家級手工拼圖」降維為「一鍵生成可視化報告」,配合事件監視器歷史 SQL 功能,大幅縮短 DBA 平均故障恢復時間(MTTR)。