DB2 自動健康監控提供 db.deadlock_rate 指標,幫助 DBA 及時發現死鎖激增。本文解析其計算邏輯、常見成因、官方建議工具與實務優化方向。
(db.deadlocks - db.deadlocks) ,其中 t 為當前快照,t-1 為 5 分鐘前快照。LOCK TABLE 而非行鎖。| 工具 | 用途 | 啟動方式 |
|---|---|---|
| Event Monitor | 捕獲死鎖事件細節 (鎖鏈、SQL、持有時間) | Control Center → Event Monitors → Create |
| Activity Monitor | 預定義報表:鎖使用、應用併發、SQL 用量 | Control Center → Database → Activity Monitor 或 db2am 命令 |
LOCK TABLE,改用行鎖或 SELECT ... FOR UPDATE。LOCKLIST、MAXLOCKS:適當增大,減少鎖升級。DLCHKTIME:死鎖檢測間隔 (預設 10 秒),高併發可調小。DB2_CAPTURE_LOCK_TIMEOUT 記錄鎖超時詳情。OFFSET 大量掃描,改用游標/Keyset 分頁。#!/bin/bash
# 每分鐘抓取死鎖計數差值
PREV=$(db2 get snapshot for database on $DB | grep "Deadlocks detected" | awk '{print $4}')
sleep 300
CURR=$(db2 get snapshot for database on $DB | grep "Deadlocks detected" | awk '{print $4}')
RATE=$((CURR - PREV))
[ $RATE -gt 10 ] && echo "ALERT: deadlock rate $RATE/5min" | mail -s "DB2 Deadlock Alert" dba@corp.com
持續觀察 db.deadlock_rate、配合 Event Monitor 根因分析、從應用與資料庫雙向優化,才能從根本上降低死鎖風險。