DB2 Command Line Processor (CLP) 是 DB2 內建的輕量級交互/腳本接口,特性:
RUNSTATS/REORG/BACKUP)、系統管理 (db2start/db2stop/db2licm)db2cmd/SSH 實現跨平台無人值守運維| 模式 | 啟動方式 | 提示符 | 適用場景 | 退出命令 |
|---|---|---|---|---|
| 交互模式 | db2 | db2 => | 探查性查詢、逐步調試、動態 SQL | QUIT / TERMINATE |
| 單命令模式 | db2 "SQL/命令" | OS 提示符 | 腳本嵌入、Cron 任務、CI/CD 流水線 | 自動退出 |
| 批處理模式 | db2 -tf script.clp / db2 -tvf script.clp | 無 | 複雜部署、結構化腳本、錯誤處理 | 文件結束 |
# 直接在 Shell 執行 (需實例用戶環境)
db2 "SELECT COUNT(*) FROM SYSCAT.TABLES"
db2 connect to sample
db2 -tvf deploy_schema.clp
REM 必須在 db2cmd 窗口或調用 db2cmd /c /w /i 執行
db2cmd /c /w /i db2 "SELECT * FROM EMPLOYEE WHERE SALARY > 50000"
REM 腳本執行
db2cmd /c /w /i db2 -tvf C:\scripts\backup_db.clp
REM PowerShell 中調用
& "C:\Program Files\IBM\SQLLIB\BIN\db2cmd.exe" /c /w /i "db2 -tvf .\script.clp"
關鍵參數:
/c執行完關閉窗口,/w等待命令完成,/i繼承當前環境變量 (含 DB2INSTANCE)。
| 字符 | 含義衝突 | 轉義寫法 | 示例 |
|---|---|---|---|
> | Shell 重定向 vs SQL 大於號 | ">" (雙引號包裹) | db2 "SELECT * FROM T WHERE C > 100" |
| | Shell 管道 vs SQL 位或 | "|" | db2 "SELECT B'101' | B'011' FROM SYSIBM.SYSDUMMY1" |
& | Shell 後台 vs SQL 位與 | "&" 或 ^& | db2 "SELECT 5 & 3 FROM SYSIBM.SYSDUMMY1" |
% | 批處理變量 vs SQL 通配符 | %% (批處理中) | db2 "SELECT * FROM T WHERE C LIKE 'ABC%%'" |
" | 字符串界定符 | "" (雙寫) 或 ' (單引號) | db2 "SELECT 'O''BRIEN' FROM SYSIBM.SYSDUMMY1" |
db2level # 版本/修補包信息
db2licm -l # 授權狀態
db2getdbmcfg # 數據庫管理器配置
db2pd -dbptnmem # 內存池快照
db2 "SELECT COUNT(*) FROM SYSCAT.TABLES" # 目錄可訪問性
db2 "CALL SYSPROC.ENV_GET_INST_INFO()" # 實例信息 (V9.7+)
db2pd -db sample -bufferpools # 緩衝池命中率
# 1. 服務器本地 CLP → 排除 DB2 引擎/配置問題
# 2. 客戶端 CLP (編目後) → 排除網絡/通信協議/客戶端配置
# 3. 應用程序 (JDBC/ODBC/CLI) → 排除驅動/連接池/應用代碼
-- daily_runstats.clp
-- 參數化:數據庫、Schema、表列表文件
CONNECT TO $1 USER $2 USING $3;
-- 讀取表列表文件 (每行一個 schema.table)
-- 需配合 Shell 腳本循環調用或使用 db2 "CALL SYSPROC.ADMIN_CMD('RUNSTATS ...')"
-- 示例:單表全採樣
CALL SYSPROC.ADMIN_CMD('RUNSTATS ON TABLE SALES.FACT_SALES WITH DISTRIBUTION AND DETAILED INDEXES ALL ALLOW WRITE ACCESS');
-- 索引重組建議檢查
SELECT TABSCHEMA, TABNAME, INDNAME,
REORG_RECOMMENDATION
FROM TABLE(SYSPROC.REORGCHK_TB_STATS('T', 'SALES.FACT_SALES'))
WHERE REORG_RECOMMENDATION = '*';
TERMINATE;
#!/bin/bash
# backup_db2.sh - 每日增量,每週全備,保留 30 天
DB=PRODDB
INST=db2inst1
BKP_PATH=/db2/backup/${DB}
LOG_FILE=/db2/log/backup_$(date +%Y%m%d).log
# 載入實例環境
. /home/${INST}/sqllib/db2profile
# 判斷備份類型
if [ $(date +%u) -eq 7 ]; then # 週日全備
TYPE="FULL"
CMD="BACKUP DATABASE ${DB} ONLINE TO ${BKP_PATH} COMPRESS INCLUDE LOGS"
else
TYPE="INCR"
CMD="BACKUP DATABASE ${DB} ONLINE INCREMENTAL TO ${BKP_PATH} COMPRESS INCLUDE LOGS"
fi
echo "[$(date)] Starting ${TYPE} backup..." | tee -a ${LOG_FILE}
db2 -v ${CMD} 2>&1 | tee -a ${LOG_FILE}
RC=${PIPESTATUS[0]}
if [ ${RC} -eq 0 ]; then
echo "[$(date)] Backup SUCCESS" | tee -a ${LOG_FILE}
# 清理 30 天前備份
find ${BKP_PATH} -name "*.001" -mtime +30 -delete
else
echo "[$(date)] Backup FAILED (RC=${RC})" | tee -a ${LOG_FILE}
# 告警通知
mail -s "DB2 Backup Failed: ${DB}" dba@company.com < ${LOG_FILE}
fi
-- controlled_script.clp
-- 終止符重定義避免分號衝突
-- #SET TERMINATOR @
-- 變量定義 (CLP 變量,非 SQL 變量)
-- #SET VAR SCHEMA = 'SALES'
-- #SET VAR THRESHOLD = 80
CONNECT TO PRODDB;
-- 條件執行:表空間使用率檢查
-- 此處需配合 SQL PL 或外部 Shell 實現邏輯判斷
-- 推薦:Shell 層面判斷,CLP 單純執行 SQL
-- 錯誤處理:捕獲 SQLCODE
-- #SQLCODE -803 CONTINUE -- 忽略主鍵衝突繼續
-- #SQLCODE -206 EXIT -- 列不存在直接退出
-- 事務控制
-- #SET AUTOCOMMIT OFF
INSERT INTO AUDIT_LOG (...) VALUES (...);
COMMIT;
TERMINATE;
@
| 工具 | 優勢 | 劣勢 | 推薦場景 |
|---|---|---|---|
| CLP (db2) | 原生、零依賴、全功能、腳本首選 | 無語法高亮、交互體驗一般 | 生產自動化、CI/CD、故障排查 |
| Db2 Command Editor (Data Studio/Web Console) | 語法高亮、結果集可視化、計劃解釋 | 需 GUI/瀏覽器、不適合腳本 | 開發調試、臨時查詢、計劃分析 |
| DBeaver / DataGrip | 多數據庫統一、智能提示、ER 圖 | 第三方、JDBC 連接、非原生命令支持弱 | 開發主力 IDE、異構數據庫環境 |
| db2pd / db2top | 實時監控、性能診斷專用 | 唯讀、無 DML 能力 | 性能調優、現場排查 |
CLP 是 DB2 DBA 技能樹的根節點。掌握三種運行模式、轉義規範、腳本化模板、分層排查思維,即可應對 90%+ 的日常運維與自動化場景。建議將常用腳本納入版本控制 (Git),構建團隊DB2 運維腳本庫,實現知識沉澱與標準化交付。