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 2844 Coins(多重背包)
    HDU 4540 威威猫系列故事——打地鼠(DP)
    Codeforces Round #236 (Div. 2)
    FZU 2140 Forever 0.5
    HDU 1171 Big Event in HDU(DP)
    HDU 1160 FatMouse's Speed(DP)
    ZOJ 3490 String Successor
    ZOJ 3609 Modular Inverse
    ZOJ 3603 Draw Something Cheat
    ZOJ 3705 Applications
  • 原文地址:https://www.cnblogs.com/dyllove98/p/4103628.html
Copyright © 2011-2022 走看看