首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 鎖等待快速定位實戰:db2pd + db2dart 四步鎖定具體行

     編輯:DB2 教學

現象與目標

SQL 執行緩慢但 CPU/內存閒置,疑似鎖等待。目標:誰在等?等誰的鎖?鎖在哪張表?鎖在哪一行?

四步閉環(同 97881,此處精簡強調關鍵差異)

1. 找等待應用

db2pd -db EOS -applications

關注 Status=Lock-wait 的 AppHandl。

2. 看鎖資源

db2pd -db EOS -locks showlock wait

記錄 TbspaceID、TableID、RecordID(如 0x0266807)。

3. 解析表名

db2 "SELECT TBSPACE, TABSCHEMA, TABNAME FROM SYSCAT.TABLES WHERE TBSPACEID=2 AND TABLEID=1560"

4. 定位行


# RecordID 0x0266807 -> 頁號 0x02668=157312、槽號 0x07
db2dart EOS /dd /tsi 2 /oi 1560 /ps 157312p /np 1 /v y

報告中 Slot 7 顯示 Column 1=4, Column 2='a',確認被鎖行 (4,'a')。

關鍵差異提示

  • 本文環境為 DB2 V8.1 on AIX,db2dart 路徑為 /home/db2inst1/sqllib/db2dump/DART0000/EOS.RPT。
  • db2pd -locks showlock wait 僅顯示等待者視角,若需持有者完整事務 SQL 歷史,請參考 97877 文章啟用 DB2_CAPTURE_LOCKTIMEOUT + 死鎖事件監視器 DETAILS HISTORY。

一鍵排查腳本雛形


#!/bin/ksh
DB=EOS
WAIT_APP=$(db2pd -db $DB -applications | awk '/Lock-wait/{print $2}')
if [[ -n $WAIT_APP ]]; then
  db2pd -db $DB -locks showlock wait | tee /tmp/lock_$$.out
  TSID=$(awk '/TbspaceID/{print $2}' /tmp/lock_$$.out)
  TABID=$(awk '/TableID/{print $2}' /tmp/lock_$$.out)
  RECID=$(awk '/RecordID/{print $2}' /tmp/lock_$$.out)
  db2 "SELECT TBSPACE,TABSCHEMA,TABNAME FROM SYSCAT.TABLES WHERE TBSPACEID=$TSID AND TABLEID=$TABID"
  # RecordID 解析略
fi

總結

「應用 → 鎖 → 表 → 行」四步配合 db2pd/db2dart 可在 5 分鐘內定位行級鎖根因,指導應用縮短事務、增加索引覆蓋或調整隔離級別消除等待。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved