0
点赞
收藏
分享

微信扫一扫

监控自建MySQL慢查询日志并上报到企业微信集群

一世独秀 2023-04-25 阅读 68

shell脚本如下

#!/bin/bash

# 设置企业微信机器人webhook地址和机器人名称
WEBHOOK_URL="你的WEBHOOK_URL"
BOT_NAME="MySQL Slow Log Bot"

# 设置慢日志文件路径和记录已发送行数的文件路径
LOG_FILE="/data/mysql/mysql-slow-log.log"
SENT_LINE_FILE="/tmp/mysql-slow-log.sent"
#LOG_FILE="/data/mysql/b.log"
#SENT_LINE_FILE="/tmp/test.sent"

# 获取上次已发送的行数
if [ -f $SENT_LINE_FILE ]; then
    LAST_SENT_LINE=`cat $SENT_LINE_FILE`
else
    LAST_SENT_LINE=0
    touch ${SENT_LINE_FILE}
fi

# 获取当前日志文件的总行数和新增行数
TOTAL_LINES=`wc -l $LOG_FILE | awk '{print $1}'`
let "NEW_LINES = ${TOTAL_LINES} - ${LAST_SENT_LINE}"


# 如果没有新增行,则不需要发送消息
if [ $NEW_LINES -eq 0 ]; then
    exit 0
fi

# Filter slow log content
for time_chuo_line in `cat -n ${LOG_FILE} | tail -${NEW_LINES} | grep '# Time' | awk '{print $1}'`;do 

let "user_host_line=$time_chuo_line + 1"
let "select_response_time_line=$time_chuo_line + 2"
let "select_start_time_line=$time_chuo_line + 3"
let "execule_sql_line=$time_chuo_line + 4"

time_chuo=`sed -n ${time_chuo_line}p ${LOG_FILE}`
user_host=`sed -n ${user_host_line}p ${LOG_FILE}`
elect_response_time=`sed -n ${select_response_time_line}p ${LOG_FILE}`
select_start_time=`sed -n ${select_start_time_line}p ${LOG_FILE}`
execule_sql=`sed -n ${execule_sql_line}p ${LOG_FILE}`

i=1
   while true
   do
     if [[ "${execule_sql: -1}" == ";" ]]; then
        break
     else
        #echo "###############"
        let "execule_sql_line=$execule_sql_line + ${i}"
        execule_sql_new=`sed -n ${execule_sql_line}p ${LOG_FILE}`
        execule_sql="${execule_sql}\n${execule_sql_new}"
     fi
       #sleep 2
     #echo -e $execule_sql
   done

curl "${WEBHOOK_URL}" \
-H 'Content-Type: application/json' \
-d "
{
  \"msgtype\": \"text\",
  \"text\": {
    \"content\": \"测试服务器慢查询日志统计:
- 日志的时间戳: ${time_chuo}
- 用户与主机: ${user_host}
- 查询响应时间: ${elect_response_time}
- 查询开始的时间::${select_start_time}
- 执行的SQL语句::${execule_sql}\"
  }
}"

done

echo ${TOTAL_LINES} > ${SENT_LINE_FILE}

报警内容如下

监控自建MySQL慢查询日志并上报到企业微信集群_mysql

这是MySQL的查询日志输出,它包含了一个SELECT语句的信息。每个字段表示以下内容:

  • Time: 查询的时间戳。
  • User@Host: 用户名和主机地址。
  • Id: 连接线程Id。
  • Query_time: 查询执行时间,以秒为单位。在这个例子中,查询执行时间是 1.352601 秒。
  • Lock_time: 在查询期间锁定资源的时间,以秒为单位。在这个例子中,锁定时间是 0.000143 秒。
  • Rows_sent: 返回结果集的行数。在这个例子中,返回结果集的行数是 2533 行。
  • Rows_examined: 扫描表时检查的行数。在这个例子中,检查的行数是 2663 行。
  • SET timestamp=1682432102;:SQL语句中的一个特殊注释,用于指示查询开始的时间戳。
  • 最后是sql语句
举报

相关推荐

0 条评论