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的查询日志输出,它包含了一个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语句