zoukankan      html  css  js  c++  java
  • MySQL慢日志监控脚本实例剖析

       公司线上的 MySQL 慢日志,之前一直没有做好监控。趁着上周空闲,我就把监控脚本写了下,今天特地把代码发出来与51博友分享一下。

           针对脚本的注解和整体构思,我会放到脚本之后为大家详解。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    #!/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=liuhao@51baturu.com            # 指定发送给哪个管理员
     
    function USAGE {
        echo -e "33[31m脚本名称: 33[37m"
        echo "    $0"
        echo -e "33[31m语法结构: 33[37m"
        echo "    $0 {start|stop|restart} MySQL慢日志文件路径"
        echo -e "33[31m使用范例: 33[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 "33[31m注意事项: 33[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#-}
            tail -$SUM_POINT $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!

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

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

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

    wKiom1RpXvbQT11mAANgpoABdRc407.jpg

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

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

    wKioL1RpaCmDwmdoAADNd7VSm3c747.jpg

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

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

  • 相关阅读:
    HDU 1097
    HDU 1045
    HDU 1039 -Easier Done Than Said?
    HDU 1038
    HDU 1037 - Keep on Truckin'
    HDU 1036 - Average is not Fast Enough!
    hdu 1701 ACMer
    hdu 1711 Number Sequence(kmp)
    hdu 2087 剪花布条
    字符串匹配-KMP算法学习笔记
  • 原文地址:https://www.cnblogs.com/dyllove98/p/4103628.html
Copyright © 2011-2022 走看看