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

DB2 故障診斷與最佳實踐完整指南

     編輯:DB2 教學

問題分類雙維度

  1. 有無錯誤碼:有錯誤碼 → db2 ? SQLxxxx 查詢說明並對症下藥;無錯誤碼 (Hang/高 CPU) → 依賴經驗與工具診斷。
  2. 範圍與性質:實例問題、資料庫問題、效能問題、應用開發問題。

一、實例問題

1. 啟動報錯 (如 SQL1042C)

  • 依錯誤碼處理;無效則嘗試:
    cd /usr/opt/db2_08_01/instance/
    ./db2iupdt <instance>  # root 身份重新更新實例
  • 常見原因:打補丁未 db2iupdt、檔案權限被改 777、實例檔案損壞、主機名與 db2nodes.cfg 不符。

2. 啟動 Hang

su -
db2_kill
ipclean
su - root
kill -9 所有該實例 db2 進程
db2start

通常因前次未正常關閉導致共享記憶體/信號量殘留。

3. 實例崩潰

  • 首查 db2diag.log、db2dump 目錄下 trap 檔。
  • 產品 Bug → 打最新 Fix Pack 或聯繫 IBM 支援 (含臨時修訂)。
  • 非產品因素 (OS、誤操作) → 完善運維規範避免復發。
  • 常見:交換空間耗盡、關鍵進程被 kill -9。

二、資料庫問題

1. 連線失敗

  • 代碼頁錯誤:db2set DB2CODEPAGE=... DB2COUNTRY=... 與資料庫一致。
  • 通訊協定錯誤:檢查 DB2COMM=TCPIP、SVCENAME (端口/服務名)、services 檔、netstat -an | grep PORT 確認 LISTEN。
  • BACKUP PENDING:完成一次離線備份即可解除。

2. 資料庫損壞

  • 最佳:從備份恢復。
  • 無備份:db2dart /DDEL 導出殘存資料 (需離線)。
  • 存儲層故障導致部分損壞:可連線時用 EXPORT,不可連線時只能 db2dart。

3. 活動日誌被誤刪

  • 有備份 → 恢復 + 前滾至尾。
  • 無備份 → 聯繫 IBM 支援或自行 db2dart 搶救。
  • 預防:啟用 鏡像日誌、USEREXIT 自動歸檔、刪除歸檔日誌用 PRUNE LOGFILE PRIOR TO <file>。

三、效能問題診斷三步曲

1. 系統資源快速定位

現象可能原因
CPU 高、I/O 低大量排序
I/O 忙、CPU 多 WAIT過多 I/O (全表掃描、索引碎片)
CPU/I/O 皆閒鎖等待
CPU/I/O 皆高高成本 SQL 執行中

2. 定位高成本 SQL

# 開啟監控
db2 UPDATE MONITOR SWITCHES USING BUFFERPOOL ON LOCK ON SORT ON STATEMENT ON TABLE ON UOW ON

# 繁忙時刻抓應用快照
db2 GET SNAPSHOT FOR ALL APPLICATIONS > app.out
# 檢視 Executing 狀態應用的 SQL

# 或抓動態 SQL 快照
db2 GET SNAPSHOT FOR DYNAMIC SQL ON <db> > sql.out
# 依 Total execution time / CPU time 找出最耗時語句

3. SQL 優化工具鏈

# 1. 看存取計劃與成本
db2expln -d <db> -f sql.in -z ";" -g -o sql.exp

# 2. 索引建議
db2advis -d <db> -i sql.in

# 3. 業務層面重寫 (若索引無法解決)

4. 鎖問題處理

  • LOCKTIMEOUT 禁用 -1 (無限等待)。
  • db2 GET SNAPSHOT FOR DB ON <db> 看 Deadlocks detected / Lock Timeouts。
  • 死鎖深度分析:
    mkdir /tmp/dlmon
    db2 CONNECT TO <db>
    db2 CREATE EVENT MONITOR dlmon FOR DEADLOCKS WITH DETAIL WRITE TO FILE '/tmp/dlmon' REPLACE
    db2 SET EVENT MONITOR dlmon STATE 1
    # 等待死鎖發生
    db2 SET EVENT MONITOR dlmon STATE 0
    db2evmon -d /tmp/dlmon > /tmp/dlmon.out

四、應用開發常見坑

  • 64 位實例:客戶端用 32 位實例連 64 位伺服器,完美屏蔽差異。Java SP/UDF 需 64 位 JDK。
  • V7→V8 遷移:long → sqlint32 或編譯加 LONGERROR NO;CALL 宿主變數改動態 SQL;SQL0433 同理改動態呼叫。
  • Java 最佳實踐:連線池 + PreparedStatement 批次執行。

結語

故障處理核心:分類 → 定位 → 對症 → 預防。命令細節請查閱官方文檔,建立團隊運行手冊並定期演練。

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