评论

收藏

[MySQL] MySQL慢日志监控脚本实例剖析

数据库 数据库 发布于:2021-07-03 21:57 | 阅读数:591 | 评论:0

       公司线上的 MySQL 慢日志,之前一直没有做好监控。趁着上周空闲,我就把监控脚本写了下,今天特地把代码发出来与51博友分享一下。
       针对脚本的注解和整体构思,我会放到脚本之后为大家详解。
#!/bin/bash
#
# 本脚本用来在指定频率内监控 MySQL 慢日志的变化,并在发生增长时及时报警
# Written by sunsky
# Mail : 274546888@qq.com
# Date : 2014-11-17 10:00:00
#

MON_FILE="$2"   # 指定所要监控的脚本路径
SEC=60      # 指定所要监控的频率,即间隔多久去查看一次
MON_POINT_FILE=/tmp/mon_mysql_slow.point  # 指定MySQL慢日志的监控点存放的路径
DIFF_MON_FILE=/tmp/mon_mysql_slow.log   # 指定在监控频率内增加的MySQL慢日志信息存放路径
ADMIN_MAIL=274546888@qq.com         # 指定发送给哪个管理员
function USAGE {
  echo -e "\033[31m脚本名称: \033[37m"
  echo "  $0"
  echo -e "\033[31m语法结构: \033[37m"
  echo "  $0 {start|stop|restart} MySQL慢日志文件路径"
  echo -e "\033[31m使用范例: \033[37m"
  echo "  $0 start /usr/local/mysql/log/mysql_slow.log"
  echo "  $0 stop"
  echo "  $0 restart /usr/local/mysql/log/mysql_slow.log"
  echo -e "\033[31m注意事项: \033[37m"
  echo "  1. 除了stop操作,start和restart操作时,\$2 参数不能为空"
  echo "  2. \$2 参数指定的文件必须存在"
  exit 2
}
function start {
  echo "MySQL慢日志监控进程已经启动,监控文件为 $MON_FILE ,监控频率为 ${SEC}s一次."
  while :
  do
    [ -f $MON_POINT_FILE ] || echo 0 > $MON_POINT_FILE
    NEW_POINT=$(awk 'END{print NR}' $MON_FILE)
    OLD_POINT=$(<$MON_POINT_FILE)
    [[ -z $OLD_POINT ]]&&OLD_POINT=0
    SUM_POINT0=$(($NEW_POINT-$OLD_POINT))
    SUM_POINT=${SUM_POINT0#-}
    sed -n "$OLD_POINT,${NEW_POINT}p" $MON_FILE > $DIFF_MON_FILE
    if [[ -s $DIFF_MON_FILE ]];then
      sed -i '1i 本次新增慢日志 '$SUM_POINT' 条'  $DIFF_MON_FILE
      mail -s "[警告] 服务器 $(hostname) 产生 MySQL 慢日志 $SUM_POINT 条" $ADMIN_MAIL < $DIFF_MON_FILE
      > $DIFF_MON_FILE
      echo $NEW_POINT > $MON_POINT_FILE
    fi
    sleep ${SEC}s
  done
}
function stop {
    if [[ -n `ps -ef|awk '$0~"mon_mysql_slow_log.sh"{print $2}'` ]];
      then
        for PID in `ps -ef|awk '$0~"mon_mysql_slow_log.sh"{print $2}'`;
             do
               [[ $PID != $$ ]] && kill -9 $PID >& /dev/null
             done
      else
        echo '目前暂无MySQL慢日志监控进程'
        exit 0
    fi
    echo 'MySQL慢日志监控进程已经停止运行'
}
function restart {
    stop
    start &
}
if [[ $1 == stop ]]
  then
    :
  else
    [[ $2 < 3 ]] && USAGE
    [[ ! -f $2 ]] && USAGE
fi
case $1 in
  start)
    start &
    ;;
  stop)
    stop
    ;;
  restart)
    MON_FILE=$2
    restart
    ;;
  *)
    USAGE
    ;;
esac
        OK!
         以上就是脚本的全部内容。整个脚本由四个主函数构成。针对每个函数的作用,我这里做下介绍:
USAGE   # 该函数负责提示用户如何正确使用该脚本
start   # 该函数负责启动脚本
stop  # 该函数负责停止监控脚本
restart # 该函数负责重启监控脚本
         下面附上脚本的使用效果图:
DSC0000.jpg

        脚本的整个思路就是,通过while :;do statement;done启一个死循环,然后在死循环里面通过 sleep 来控制死循环的循环间隔。在指定的循环间隔内,通过取MySQL慢日志的长度作为一个记录点,然后在下一个循环到来时,通过比对上一个记录点来得出,日志是否有变化。如果有变化,就通过计算记录点的差值来得出增长值。通过增长值来获取到增长的这部分日志,然后通过mail发送到指定的管理员邮箱。
        这里展示下发送出来的邮件:
   DSC0001.jpg
         OK!其它的一看就懂,这里就不废话了。

        本文到此结束,希望能对51博友有所帮助!

  
关注下面的标签,发现更多相似文章