达梦数据库-数据文件 (二)
达梦数据库-数据文件(二)-自动监控达梦数据库表空间使用率的 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; then echo \"$body\" | mailx -v -s \"$subject\" \\ -S smtp=\"$SMTP_SERVER:$SMTP_PORT\" \\ -S from=\"$FROM_EMAIL\" \\ \"$TO_EMAIL\" log_info \"告警邮件已发送: $subject\" else log_info \"邮件未启用,告警内容: $subject\" fi}# 检查数据库是否可达if ! $DISQL $SYS_USER/$SYS_PWD@$DB_HOST:$DB_PORT << EOF > /dev/null 2>&1SELECT 1 FROM DUAL;EXITEOFthen log_crit \"数据库连接失败!请检查实例状态\" send_alert \"【严重】达梦数据库连接失败\" \"无法连接到达梦数据库,请立即检查!\" exit 1fi# 执行 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_USEDFROM ( SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS TOTAL_MB, SUM(USER_BYTES)/1024/1024 AS USED_MB FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) TBSORDER BY PCT_USED DESC;EXIT;\"# 执行查询RESULT_FILE=$(mktemp)$DISQL $SYS_USER/$SYS_PWD@$DB_HOST:$DB_PORT << EOF > \"$RESULT_FILE\"$SQL_QUERYEOF# 解析结果并检查阈值CRITICAL_ALERT=\"\"WARNING_ALERT=\"\"while IFS=\' \' read -r name total_mb used_mb pct_used; do # 跳过空行或标题 if [[ -z \"$name\" || \"$name\" == \"TABLESPACE_NAME\" ]]; then continue fi # 移除可能的回车符 pct_used=$(echo \"$pct_used\" | tr -d \'\\r\') # 必须是数字才处理 if ! [[ \"$pct_used\" =~ ^[0-9]+\\.?[0-9]*$ ]]; then continue fi log_info \"表空间: $name, 大小: ${total_mb}MB, 已用: ${used_mb}MB, 使用率: ${pct_used}%\" if (( $(echo \"$pct_used > $CRITICAL_THRESHOLD\" | bc -l) )); then CRITICAL_ALERT=\"$CRITICAL_ALERT\\n表空间 [$name] 使用率 ${pct_used}% (>${CRITICAL_THRESHOLD}%)\" elif (( $(echo \"$pct_used > $WARNING_THRESHOLD\" | bc -l) )); then WARNING_ALERT=\"$WARNING_ALERT\\n表空间 [$name] 使用率 ${pct_used}% (>${WARNING_THRESHOLD}%)\" fidone < \"$RESULT_FILE\"# 发送告警if [ -n \"$CRITICAL_ALERT\" ]; then MSG=\"【严重告警】达梦表空间使用率过高!$CRITICAL_ALERT\" log_crit \"$MSG\" send_alert \"【严重】达梦表空间使用率过高\" \"$MSG\"elif [ -n \"$WARNING_ALERT\" ]; then MSG=\"【警告】达梦表空间使用率偏高!$WARNING_ALERT\" log_warn \"$MSG\" send_alert \"【警告】达梦表空间使用率偏高\" \"$MSG\"else log_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
/tmp/dm_tablespace_monitor.log
mktemp
创建临时文件📧 邮件告警示例
主题:【严重】达梦表空间使用率过高
内容:
【严重告警】达梦表空间使用率过高!表空间 [DMHR] 使用率 99.9%表空间 [TEMP] 使用率 96.2%
✅ 建议配置
WARNING_THRESHOLD
80
CRITICAL_THRESHOLD
95
ENABLE_EMAIL
true
(生产环境)TO_EMAIL
📊 输出示例(日志)
[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
- 历史趋势分析:将结果写入数据库,生成趋势图