博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL慢日志监控脚本实例剖析
阅读量:7207 次
发布时间:2019-06-29

本文共 2828 字,大约阅读时间需要 9 分钟。

       公司线上的 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 ]] && USAGEficase $1 in    start)        start &        ;;    stop)        stop        ;;    restart)        MON_FILE=$2        restart        ;;    *)        USAGE        ;;esac

      OK!

       以上就是脚本的全部内容。整个脚本由四个主函数构成。针对每个函数的作用,我这里做下介绍:

USAGE   # 该函数负责提示用户如何正确使用该脚本start   # 该函数负责启动脚本stop    # 该函数负责停止监控脚本restart # 该函数负责重启监控脚本

       下面附上脚本的使用效果图:

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

      这里展示下发送出来的邮件:

      OK!其它的一看就懂,这里就不废话了。

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

转载地址:http://igaum.baihongyu.com/

你可能感兴趣的文章
Eclipse europa 更新时 Error retrieving "feature.xml". [error in opening zip file]的解决
查看>>
Hyper-V损坏数据恢复报告
查看>>
《从零开始学Swift》学习笔记(Day 16)——字典集合
查看>>
[转]配置nginx+apache 其中动态由apache处理,静态由nginx处理
查看>>
在Word中如何实现"后退"?
查看>>
简明 Vim 练级攻略 | 酷壳 - CoolShell.cn
查看>>
养成逻辑的习惯
查看>>
jQuery attributes(上)
查看>>
ISO8583报文协议(转)
查看>>
Android文本框实现搜索和清空效果
查看>>
Logic-算法-XX部队XX侦察队员
查看>>
海量数据(数据量比较大时)的处理分析
查看>>
printf 规定数据输出方式
查看>>
Facebook Graph API(2)--读取数据之picture
查看>>
使用分析服务多维模式建立简单的分析模型
查看>>
Oracle Real Application Testing diagram
查看>>
IoC容器Autofac(2) - 一个简单示例(附demo源码)
查看>>
桥接模式 - 设计模式学习
查看>>
Google Maps Android API v2 (2)- 地图对象
查看>>
MySQL 5.5 手册下载
查看>>