对比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
相关产品推荐
相关产品推荐

