DB2 故障千變萬化,但解決核心只有一條:**精準分類 → 對症下藥 → 預防復發**。本文建立雙軌分類體系:「有無錯誤碼」 與 「故障域範圍」 (實例/資料庫/效能/應用),並針對各類別給出標準診斷流程、實戰案例與預防性最佳實踐。
標準處理流:
db2 ? SQLxxxx 查閱官方說明
db2 connect to sample
SQL0332N There is no available conversion for the source code page "1386"
to the target code page "819". Reason Code "1". SQLSTATE=57017
診斷:
db2 ? sql0332
# Reason Code 1: source and target code page combination is not supported by the database manager.
修復: 統一用戶端代碼頁
db2set DB2CODEPAGE=1386
db2 terminate
db2 connect to sample
# 連線成功
核心工具鏈: db2pd, db2top, db2mon, db2getsnaps, db2trc, OS 層 top/vmstat/iostat/netstat
診斷心法: 由外而內 (OS → 實例 → 資料庫 → 應用),抓取快照對比基準線,鎖定熱點資源。
排查清單:
db2iupdt <inst_name> 更新實例 (修補包安裝後必做)db2nodes.cfg 主機名與 hostname 一致ipcs -a)原因: 上次未正常關閉,殘留共享記憶體/信號量/進程
標準清理序列:
su - <inst_user>
db2_kill # 釋放共享記憶體/信號量
ipclean # 清理 IPC 資源 (AIX/Linux)
# 或手動:ps -ef | grep db2 | grep -v grep | awk '{print $2}' | xargs kill -9
su - root # 如需清理跨用戶 IPC
db2start
db2diag.log 末段錯誤堆疊db2dump/ 下 trap 檔案db2iupdtPaging Space 使用率 < 70%chmod -R 777db2nodes.cfg 與 DNS/hosts 一致性| 錯誤類型 | 典型 SQLCODE | 排查重點 |
|---|---|---|
| 代碼頁不符 | SQL0332N | DB2CODEPAGE, DB2TERRITORY |
| 通訊協定/埠口 | SQL1326N, SQL30081N | DB2COMM=TCPIP, SVCENAME, services 檔, 防火牆, netstat -an |
| 備份懸掛 | SQL1117N | 執行離線備份 db2 backup db |
| 授權/權限 | SQL0551N, SQL1092N | GRANT CONNECT, SECADM, DATAACCESS |
分級應對:
EXPORT 正常表 + db2dart /DDEL 導出損壞表資料 → 重建表 → LOAD 還原db2dart /DDEL 導出所有資料 → 重建資料庫 → LOAD 還原 (極高風險,資料可能不全)鐵律: 無備份 = 無恢復。定期驗證備份可用性 (db2ckbkp) 是 DBA 底線。
系統化診斷流程:
db2getsnaps (完整快照)、db2top (即時)、db2pd -db <db> -transactions -locks -buffers -tablespacesRUNSTATS 定時自動化RUNSTATS + REORGCHK 評估LOCK_WAIT_TIME 而非單純計數| 常見模式 | 症狀 | 根因 | 最佳實踐 |
|---|---|---|---|
| 連線池洩漏 | 連線數緩增至上限、新請求掛起 | 未 close()/returnConnection()、例外路徑未釋放 | try-with-resources / finally 區塊強制關閉、監控池指標 |
| 長交易/未提交 | 鎖擁塞、日誌暴增、備份時間拉長 | 業務邏輯跨多次請求、批次處理未分批提交 | 縮短交易邊界、批次每 N 筆提交、避免用戶思考時間持有鎖 |
| N+1 查詢 | 單頁請求觸發數百 SQL、回應秒級 | ORM 惡性載入、迴圈查詢 | JOIN/FETCH JOIN、批次載入、快取 |
| 參數嗅探/計畫失效 | 同一 SQL 忽快忽慢 | 統計過期、參數值傾斜、REOPT 誤用 | REOPT ONCE/ALWAYS、穩定計畫 (OPTIMIZATION PROFILE) |
| 字符集轉換開銷 | CPU 高、延遲大 | 用戶端/資料庫編碼不一致、隱性轉換 | 統一 UTF-8、DB2CODEPAGE 正確設定 |
DB2 故障處理不是玄學,而是**結構化思維 + 扎實工具鏈 + 經驗沉澱**的工程實踐。建立「有碼查碼、無碼查資源、按域分層、預防優於治療」的團隊文化,才能在關鍵時刻守住資料庫的穩定與可用。