達夢數據庫-數據文件(二)-自動監控達夢數據庫表空間使用率的 Shell 腳本
自動監控達夢數據庫表空間使用率的 Shell 腳本,支持:
- ? 實時計算每個表空間的使用率
- ? 設置閾值告警(如 >80%)
- ? 支持郵件告警(可選)
- ? 日志記錄
- ? 可集成到定時任務(crontab)
📄 腳本名稱:check_dameng_tablespace.sh
#!/bin/bash# ========================================
# 達夢數據庫表空間使用率監控腳本
# 功能:檢查表空間使用率,超閾值發送告警
# 作者:DBA
# ========================================# ====== 用戶可配置區 ======
DM_HOME="/dm8"
BIN_DIR="$DM_HOME/bin"
DISQL="$BIN_DIR/disql"
DATA_DIR="/dm8/data/DAMENG"# 數據庫連接
SYS_USER="SYSDBA"
SYS_PWD="SYSDBA"
DB_PORT="5236"
DB_HOST="localhost"# 告警閾值(百分比)
WARNING_THRESHOLD=80 # 警告
CRITICAL_THRESHOLD=95 # 嚴重# 郵件配置(可選)
ENABLE_EMAIL=false # 是否啟用郵件告警
SMTP_SERVER="smtp.company.com"
SMTP_PORT="587"
FROM_EMAIL="db-monitor@company.com"
TO_EMAIL="dba@company.com"# 日志文件
LOG_FILE="/tmp/dm_tablespace_monitor.log"
# ==========================# 日志函數
log_info() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] INFO: $*" | tee -a "$LOG_FILE"
}log_warn() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] WARN: $*" | tee -a "$LOG_FILE"
}log_crit() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] CRITICAL: $*" | tee -a "$LOG_FILE"
}# 發送郵件函數(使用 mailx)
send_alert() {local subject="$1"local body="$2"if $ENABLE_EMAIL; thenecho "$body" | mailx -v -s "$subject" \-S smtp="$SMTP_SERVER:$SMTP_PORT" \-S from="$FROM_EMAIL" \"$TO_EMAIL"log_info "告警郵件已發送: $subject"elselog_info "郵件未啟用,告警內容: $subject"fi
}# 檢查數據庫是否可達
if ! $DISQL $SYS_USER/$SYS_PWD@$DB_HOST:$DB_PORT << EOF > /dev/null 2>&1
SELECT 1 FROM DUAL;
EXIT
EOF
thenlog_crit "數據庫連接失敗!請檢查實例狀態"send_alert "【嚴重】達夢數據庫連接失敗" "無法連接到達夢數據庫,請立即檢查!"exit 1
fi# 執行 SQL 查詢表空間使用情況
SQL_QUERY="
SET HEADING OFF;
SET FEEDBACK OFF;
SET PAGESIZE 0;
SELECT TBS.TABLESPACE_NAME,ROUND(TBS.TOTAL_MB, 2) AS TOTAL_MB,ROUND(TBS.USED_MB, 2) AS USED_MB,ROUND(TBS.USED_MB / TBS.TOTAL_MB * 100, 2) AS PCT_USED
FROM (SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 AS TOTAL_MB,SUM(USER_BYTES)/1024/1024 AS USED_MBFROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME
) TBS
ORDER BY PCT_USED DESC;
EXIT;
"# 執行查詢
RESULT_FILE=$(mktemp)
$DISQL $SYS_USER/$SYS_PWD@$DB_HOST:$DB_PORT << EOF > "$RESULT_FILE"
$SQL_QUERY
EOF# 解析結果并檢查閾值
CRITICAL_ALERT=""
WARNING_ALERT=""while IFS=' ' read -r name total_mb used_mb pct_used; do# 跳過空行或標題if [[ -z "$name" || "$name" == "TABLESPACE_NAME" ]]; thencontinuefi# 移除可能的回車符pct_used=$(echo "$pct_used" | tr -d '\r')# 必須是數字才處理if ! [[ "$pct_used" =~ ^[0-9]+\.?[0-9]*$ ]]; thencontinuefilog_info "表空間: $name, 大小: ${total_mb}MB, 已用: ${used_mb}MB, 使用率: ${pct_used}%"if (( $(echo "$pct_used > $CRITICAL_THRESHOLD" | bc -l) )); thenCRITICAL_ALERT="$CRITICAL_ALERT\n表空間 [$name] 使用率 ${pct_used}% (>${CRITICAL_THRESHOLD}%)"elif (( $(echo "$pct_used > $WARNING_THRESHOLD" | bc -l) )); thenWARNING_ALERT="$WARNING_ALERT\n表空間 [$name] 使用率 ${pct_used}% (>${WARNING_THRESHOLD}%)"fi
done < "$RESULT_FILE"# 發送告警
if [ -n "$CRITICAL_ALERT" ]; thenMSG="【嚴重告警】達夢表空間使用率過高!$CRITICAL_ALERT"log_crit "$MSG"send_alert "【嚴重】達夢表空間使用率過高" "$MSG"
elif [ -n "$WARNING_ALERT" ]; thenMSG="【警告】達夢表空間使用率偏高!$WARNING_ALERT"log_warn "$MSG"send_alert "【警告】達夢表空間使用率偏高" "$MSG"
elselog_info "所有表空間使用率正常(<${WARNING_THRESHOLD}%)"
fi# 清理臨時文件
rm -f "$RESULT_FILE"exit 0
🛠? 使用方法
1. 保存腳本
vim /dm8/script/check_dameng_tablespace.sh
2. 授予執行權限
chmod +x /dm8/script/check_dameng_tablespace.sh
3. 安裝依賴(如果未安裝)
# 安裝 bc(用于浮點比較)
sudo yum install -y bc# 安裝 mailx(用于郵件)
sudo yum install -y mailx
4. 測試腳本
/dm8/script/check_dameng_tablespace.sh
🕒 添加到定時任務(crontab)
每 30 分鐘檢查一次:
crontab -e# 添加以下行
*/30 * * * * /dm8/script/check_dameng_tablespace.sh
? 腳本功能說明
功能 | 說明 |
---|---|
? 自動連接數據庫 | 使用 disql 查詢 DBA_DATA_FILES |
? 計算使用率 | 按表空間匯總,精確到小數點后兩位 |
? 分級告警 | 警告(80%)、嚴重(95%) |
? 日志記錄 | 記錄到 /tmp/dm_tablespace_monitor.log |
? 郵件告警 | 可選啟用,支持 SMTP |
? 臨時文件安全 | 使用 mktemp 創建臨時文件 |
📧 郵件告警示例
主題:【嚴重】達夢表空間使用率過高
內容:
【嚴重告警】達夢表空間使用率過高!表空間 [DMHR] 使用率 99.9%
表空間 [TEMP] 使用率 96.2%
? 建議配置
項目 | 建議值 |
---|---|
WARNING_THRESHOLD | 80 |
CRITICAL_THRESHOLD | 95 |
ENABLE_EMAIL | true (生產環境) |
TO_EMAIL | DBA 郵箱或運維群組 |
📊 輸出示例(日志)
[2025-08-28 10:30:01] INFO: 表空間: DMHR, 大小: 228.00MB, 已用: 227.80MB, 使用率: 99.91%
[2025-08-28 10:30:01] CRITICAL: 【嚴重告警】達夢表空間使用率過高!
表空間 [DMHR] 使用率 99.91% (>95%)
🚀 進階建議
- 集成到 Zabbix/Prometheus:將輸出轉為 JSON,用于可視化監控
- 自動擴容:檢測到空間不足時,自動執行
ALTER TABLESPACE ADD DATAFILE
- 歷史趨勢分析:將結果寫入數據庫,生成趨勢圖