SQL 執行緩慢但 CPU/內存閒置,疑似鎖等待。目標:誰在等?等誰的鎖?鎖在哪張表?鎖在哪一行?
db2pd -db EOS -applications
關注 Status=Lock-wait 的 AppHandl。
db2pd -db EOS -locks showlock wait
記錄 TbspaceID、TableID、RecordID(如 0x0266807)。
db2 "SELECT TBSPACE, TABSCHEMA, TABNAME FROM SYSCAT.TABLES WHERE TBSPACEID=2 AND TABLEID=1560"
# 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')。
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 分鐘內定位行級鎖根因,指導應用縮短事務、增加索引覆蓋或調整隔離級別消除等待。