db2pd 為輕量級、無鎖、引擎外監控工具(V8.2+),支援交互/批次模式。鎖分析關鍵選項:
-locks wait showlocks:僅顯示等待鎖與持有鎖,showlocks 解析鎖名稱為表空間/表/分區/頁/槽,配合 SYSCAT.TABLES 反查表名-transactions:映射事務句柄 → 應用句柄、狀態、鎖數-agents:應用句柄 → 代理線程、用戶 ID、客戶端、讀寫行數-applications:應用狀態(Lock-wait/UOW-Waiting)、當前/上一條語句錨點 (AnchID/StmtUID)-dynamic:動態 SQL 快取內容,依錨點/StmtUID 反查具體 SQL 文本與隔離級別 (Iso: UR/CS/RS/RR)UPDATE EMPLOYEE SET BONUS=SALARY*0.1 WHERE JOB='MANAGER'(未提交)UPDATE EMPLOYEE SET SALARY=SALARY*0.02(阻塞)db2pd -db sample -locks wait showlocks -transactions -agents -applications -dynamicLocks:TranHdl=2 持有 Row X 鎖 (G=Granted),TranHdl=6 等待同鎖 (W=Wait)Transactions:TranHdl=2 → AppHandl=30 (USER_A);TranHdl=6 → AppHandl=34 (USER_B)Applications:AppHandl=34 狀態 Lock-wait,當前語句 AnchID=195, StmtUID=1Dynamic Cache:AnchID=195 → UPDATE EMPLOYEE SET SALARY = SALARY * 0.02 (Iso=CS);AnchID=60 → UPDATE EMPLOYEE SET BONUS = SALARY * 0.1 WHERE JOB = 'MANAGER'結論:USER_A 持有 X 鎖阻塞 USER_B 全表更新。對策:勸 USER_A 提交/回滾、強制斷開、配置 Governor 自動終結長事務。
db2pd -db sample -locks wait showlocks -transactions -agents -applications -dynamic \
-file db2pd.out -repeat 15 40
-file 輸出重定向文件-repeat 15 40 每 15 秒採樣 40 次(10 分鐘),捕捉短暫鎖等待LOCKTIMEOUT(如 20 秒)以捕捉超時前狀態UPDATE DB CFG FOR SAMPLE USING LOCKTIMEOUT 10db2pdcfg -catch locktimeout count=1 或 db2pdcfg -catch 911,68 count=1 (SQLCODE -911, Reason 68)db2diag -g funcname:=pdErrorCatch 確認 ZRC -2146435004 (內部鎖超時碼)sqllib/bin/db2cos (UNIX) 或 sqllib\bin\db2cos.bat (Windows),替換為完整採集命令:
db2pd -db %DATABASE% -locks wait -transactions -agents -applications -dynamic \
>> %DIAGPATH%db2cos%PID%%TID%.%DBPART%
db2pdcfg -catch cleardb2diag -rc -2146435004 查詢 ZRC 含義db2diag -g data:=-2146435004 定位超時確切時間戳