快速定位無索引表
查詢系統視圖 `syscat.tables` 與 `syscat.indexes` 即可列出無索引表:
db2 select tabname from syscat.tables
where tabname not in (select tabname from syscat.indexes)
示例輸出顯示 SAMPLE 資料庫中 354 張無索引表(如 ABC、DEPT、EMP 等),為索引優化提供靶向清單。
捕捉全表掃描熱點表
利用 `db2pd -db <dbname> -tcbstats` 監控表掃描統計。輸出分兩部分:
- TCB Table Information:列出發生過全表掃描的表名(`TableName` 欄位)
- TCB Table Stats:`Scans` 欄位顯示掃描次數
結合動態 SQL 快照,可針對高頻全掃表精準調整索引。
徹底斷開用戶連接的進階技巧
`FORCE APPLICATIONS ALL` 無法阻斷命令發出後的新連接。針對 B/S 架構,常規做法是先關閉應用服務器(如 WAS),再多次執行 FORCE。**更徹底的方案:僅對外開放資料庫別名(Alias),而非真實資料庫名。**
操作步驟
- 服務端編目別名:`db2 catalog db sample as abc`
- 客戶端僅使用別名連接
- 維護窗口:停應用服務 → 多次 FORCE → `db2 uncatalog db abc` 取消別名 → 單用戶操作完成 → 重新編目別名恢復服務
此法可有效阻斷繞過應用服務器的直接連接嘗試。
結果集建表與單引號轉義
- 建表:`create table newtest1 as (select * from test1) definition only` 僅複製結構,不複製數據。
- 單引號:INSERT 時雙單引號表示單引號,如 `values (11, ''單引'', '')` 實際存入 `'單引'`。
備份歷史文件損壞(SQL2048N rc=5)修復流程
錯誤提示 `db2rhist.asc` 損壞。修復三步走:
- 進入 `NODE000x/SQL000x` 目錄,移走 `db2rhist.asc` 及 `db2rhist.bak`;
- 重新執行備份命令,DB2 會嘗試用 `.bak` 重建 `.asc`(仍報錯但自動重建);
- 再次執行備份,應可成功。
若 `.bak` 也損壞,第一步同時移走兩文件,DB2 將自動生成全新歷史文件(歷史記錄將丟失)。
SQL0101N「語句過長或過複雜」應對
編譯複雜 SQL(多表、多觸發器)耗盡資源時拋出。優先檢查遞歸觸發器,再調整配置參數:
- 增大 `stmtheap`(語句堆)
- 增大 `applheapsz`(應用程序堆,預設 4KB)
- 增大 `pckcachesz`(包緩存,預設 4KB)
誤刪除表(DROP TABLE)恢復完整流程
**前提**:誤刪前資料庫已處於歸檔日誌模式(`logretain`/`userexit` 或 V9 `logarchmeth1`),且表所在表空間啟用「允許已廢棄的表可恢復」(`ALTER TABLESPACE ... DROPPED TABLE RECOVERY ON`)。
六步恢復法
- 確認歸檔模式與表空間屬性;
- `list history dropped table all for <db>` 獲取 `tableid` 與 DDL;
- 用誤刪前的全備映像恢復資料庫;
- 前滾時加選項:`recover dropped table <tableid> to <target_dir>`(目錄將建 `../NODE000X/data` 存放數據);
- 用第 2 步 DDL 重建表;
- 將 `target_dir` 數據導入新表。
實戰演示片段
-- 修改 SAMPLE 為歸檔模式
db2 UPDATE DATABASE CONFIGURATION USING LOGARCHMETH1 DISK:C:\DB2\IMMEDIATE
db2 FORCE APPLICATIONS ALL
db2 BACKUP DB SAMPLE -- 首次歸檔模式需全備,備份時間戳 20080405000129
後續誤刪表即可按上述流程恢復。