DB2 命令列處理器(CLP)是 DBA 與開發人員日常操作的核心介面。本文精選 20 個高頻實用命令與技巧,涵蓋字串操作、大量資料清除、匯入匯出、表存在性檢查、鎖定排查、預存程序管理、快照監控、索引驗證、日期運算、別名建立、DDL 操作、序列定義等核心場景,助你大幅提升操作效率與問題排查速度。
|| 操作子SELECT 'Hello' || ' ' || 'World' FROM sysibm.sysdummy1;
-- 結果:Hello World
符合 ANSI SQL 標準,可跨平台移植。
| 方法 | 命令範例 | 特點 | 適用場景 |
|---|---|---|---|
| DELETE | DELETE FROM test | 記錄日誌、觸發 Trigger、可回滾 | 小量資料、需觸發器 |
| IMPORT REPLACE | IMPORT FROM /dev/null OF DEL REPLACE INTO test | 不記日誌(隱含),速度中等 | 中量資料、需保留表結構 |
| ALTER TABLE ... NOT LOGGED INITIALLY WITH EMPTY TABLE | ALTER TABLE test ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE | 完全不記日誌、極速、不可回滾 | 大量資料清空、維護窗口 |
警告:NOT LOGGED INITIALLY 會導致該操作不可恢復,執行前務必確認備份策略。
-- 匯出
db2 "EXPORT TO filename.del OF DEL SELECT * FROM tablename"
-- 匯入(INSERT 模式,需表存在)
db2 "IMPORT FROM filename.del OF DEL INSERT INTO tablename"
-- 匯入(REPLACE 模式,清空後載入)
db2 "IMPORT FROM filename.del OF DEL REPLACE INTO tablename"
IXF 格式可保留欄位定義、索引、約束,適合跨環境遷移;DEL 格式輕量,適合純資料交換。
SELECT * FROM "SYSIBM"."SYSTABLES" WHERE LOWER(name) = 'afa_maintransdtl'
亦可查詢 SYSCAT.TABLES 視圖(權限較友善)。
db2 "CONNECT TO afa"
db2 "GET SNAPSHOT FOR LOCKS ON <實例名>"
db2 "TERMINATE"
分析快照輸出,找出 Application Handle(整數)對應的鎖定持有者,再強制釋放:
db2 "FORCE APPLICATION (<Application Handle>)"
進階:搭配 MON_GET_LOCKS 表函數獲取更豐富資訊。
-- SQL 檔案內部使用 @ 作為結束符
CREATE PROCEDURE my_proc()
LANGUAGE SQL
BEGIN
DECLARE v INT DEFAULT 1;
WHILE v <= 10 DO
INSERT INTO t VALUES (v);
SET v = v + 1;
END WHILE;
END @
-- 執行部署
db2 -td@ -vf filename.sql
-td@ 指定 @ 為結束符,避免程序內部分號衝突;-vf 顯示執行回饋。
RUNSTATS ON TABLE afa.yj_jywtk WITH DISTRIBUTION AND DETAILED INDEXES ALL
收集分布統計與詳細索引統計後,再執行 EXPLAIN 或查看 SYSCAT.INDEXES 的 FULLKEYCARD、CLUSTERRATIO 等指標判斷索引效益。
db2 "CONNECT TO <實例名>"
db2 "UPDATE MONITOR SWITCHES USING LOCK ON SORT ON BUFFERPOOL ON UOW ON TABLE ON STATEMENT ON"
db2 "GET SNAPSHOT FOR ALL ON <實例名>"
開啟所有監控開關後再擷取快照,可獲得鎖、排序、緩衝池、工作單元、表、語句等全維度效能資料。
SELECT PROCNAME, TEXT FROM SYSIBM.SYSPROCEDURES
亦可查詢 SYSCAT.PROCEDURES 取得更豐富中繼資料(參數、權限、建立時間等)。
LIST TABLES
加上 FOR SCHEMA <schema名> 可指定 Schema;SHOW DETAIL 顯示表空間、資料列數等細節。
VALUES LOCATE('y', 'xyz') -- 返回 2(1-based 索引)
若未找到返回 0。注意參數順序:LOCATE(搜尋字串, 目標字串, [起始位置])。
VALUES DAYS(DATE('2007-03-01')) - DAYS(DATE('2007-02-28'))
-- 返回 2
DAYS() 回傳自 0001-01-01 起的絕對天數,相減即得差值。亦可使用 DAYS_BETWEEN()(V9.7+)更直觀。
CREATE ALIAS my_alias FOR other_schema.other_table
-- 或跨實例(需 Federation 設定)
CREATE ALIAS my_alias FOR remote_server.remote_schema.remote_table
別名不佔儲存空間,僅為名稱解析層面的指標,簡化 SQL 撰寫。
DESCRIBE TABLE tablename
-- 或
DESCRIBE SELECT * FROM tablename
輸出欄位名、資料類型、長度、可否為 NULL、預設值、隱含欄位等資訊。
RESTART DATABASE db_name -- 崩潰恢復後重啟
ACTIVATE DATABASE db_name -- 預先啟動,減少首次連線延遲
DEACTIVATE DATABASE db_name -- 正常關閉,釋放記憶體
ACTIVATE 適合生產環境預熱;DEACTIVATE 會等待所有連線釋放才關閉。
RENAME TABLE old_name TO new_name
原子操作,自動更新相依物件(視圖、觸發器、約束等),索引與權限保留。
CREATE SEQUENCE orderseq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO CYCLE
CACHE 24
CACHE 24 可減少日誌寫入,提升高併發取號效能;NO CYCLE 避免數值回卷。
DESCRIBE INDEXES FOR TABLE tablename SHOW DETAIL
輸出索引名、欄位組合、唯一性、聚類比率、頁面數、層級、統計時間等關鍵指標,是索引調優的首選命令。
.db2),參數化執行。db2 -x 抑制標題輸出,配合管道符進一步處理(如 db2 -x "SELECT tabname FROM syscat.tables" | xargs -I{} db2 "RUNSTATS ON TABLE {}")。RUNSTATS 並搭配 REBIND 確保套裝計劃與時俱進。熟練掌握這 20 個命令與技巧,並理解其背後的原理與適用邊界,即能在 DB2 日維、開發、效能調優等各類場景中遊刃有餘。