You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对比MySQL表不同时间记录数触发告警脚本报错排查

修复MySQL记录数对比脚本的语法错误并实现15分钟告警功能

错误原因分析

你遇到的unexpected EOF while looking for matching "错误,是因为mysql命令的-e参数后SQL语句的双引号没有正确闭合,且变量引用方式有误:

  • 原脚本中"select count(*) from "$table_name";)这段代码,双引号在$table_name前提前闭合,导致后续语法混乱
  • 语句末尾缺少一个闭合双引号,Shell无法找到匹配的引号,触发语法错误

修复后的完整脚本

同时原脚本未实现15分钟间隔对比的核心逻辑,以下是修正语法并完善功能后的脚本:

# 数据库配置
DB_user="your_db_user"
DB_pass="your_db_password"
DB_name="your_db_name"
table_name="your_table_name"

# 存储上次记录数的临时文件
COUNT_FILE="/tmp/mysql_table_count.tmp"

# 获取当前表记录数的函数
get_table_count() {
    mysql -u "$DB_user" -p"$DB_pass" -D "$DB_name" -N -B -e "select count(*) from $table_name;"
}

# 第一次运行时初始化临时文件
if [ ! -f "$COUNT_FILE" ]; then
    get_table_count > "$COUNT_FILE"
    echo "已初始化记录数,15分钟后再次运行脚本进行对比"
    exit 0
fi

# 读取上次记录数
previous_count=$(cat "$COUNT_FILE")

# 等待15分钟(900秒)
sleep 900

# 获取最新记录数
latest_count=$(get_table_count)

# 对比记录数并执行对应操作
if [ "$latest_count" -eq "$previous_count" ]; then
    # 发送告警邮件(需系统已配置sendmail/postfix等邮件服务)
    echo "告警:$table_name 表记录数已15分钟未变化!当前记录数:$latest_count" | mail -s "MySQL表记录数告警" your_email@example.com
    echo "已发送告警邮件"
else
    # 更新临时文件为最新记录数
    echo "$latest_count" > "$COUNT_FILE"
    echo "表记录数正常更新,当前记录数:$latest_count"
fi

关键修正点

  • 修复mysql命令中SQL语句的引号问题,确保双引号正确闭合,变量$table_name能被正确解析
  • 添加临时文件存储上次记录数,实现跨脚本运行的数值持久化
  • 加入sleep 900实现15分钟间隔等待
  • 增加邮件告警逻辑(需提前配置好系统邮件服务)

内容的提问来源于stack exchange,提问作者Rinkesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:46:08