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

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

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

#!/bin/bash
#
# 本脚本用来在指定频率内监控 MySQL 慢日志的变化,并在发生增长时及时报警
# Written by sunsky
# Mail : [email protected]
# 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慢日志信息存放路径
[email protected]            # 指定发送给哪个管理员

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#-}
        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!

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

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

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

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

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

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

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

时间: 2024-10-07 13:47:53

MySQL慢日志监控脚本实例剖析的相关文章

mysql主从同步监控脚本

mysql主从同步监控脚本,利用mysql从库中的IO和SQL进程以及延迟时间来监控主从同步是否正常,详细shell脚本如下: #!/bin/bash #author wangning #date 2017-7-17 #qq 1198143315 #Email [email protected] ################################## define variable############################# define_variable(){ ip

MySQL 主从延迟监控脚本(pt-heartbeat)

对于MySQL数据库主从复制延迟的监控,我们可以借助percona的有力武器pt-heartbeat来实现.pt-heartbeat通过使用时间戳方式在主库上更新特定表,然后在从库上读取被更新的时间戳然后与本地系统时间对比来得出其延迟.本文主要是通过脚本来定期检查从库与主库复制的延迟度并发送邮件,供大家参考. 有关pt-heartbeat工具的安装可以参考:percona-toolkit的安装及简介    有关pt-heartbeat工具的介绍可以参考:使用pt-heartbeat监控主从复制延

Shell编程之批量安装服务脚本实例剖析

今天分享一下昨天写过的一个小脚本运行的整个过程运行结果如下:   剖析如下: #!/bin/bash # Date: 4:42 2018-2-10 # Mail: [email protected]163.com # Founder: <YanKai> # Describe: This is a one - button installation service script # 提示:使用此脚本时,尽量先选择第一项配置Yum源! red_col="\e[1;31m" #定

Mysql主从状态监控脚本

目标:对Mysql从库进行状态监控,如果从库复制异常就告警 思路: 1.首先查找Mysql从库的4个参数值(show slave status根据这个命令):分别是从库的IO线程.SQL线程.复制延迟时间(这个在以下脚本没用到,可以再写个脚本对其延迟进行告警).错误码 2.函数Mysql_status判断,对IO线程.SQL线程.错误码三者逻辑与判断 3.如果为假则执行函数Mysql_Errno 4.对于mysql错误码为1158 1159 1008 1007 1062 我们可以进行停止slav

mysql主从状态监控脚本报警脚本

#!/bin/bash MYSQLPORT=`netstat -antlp |grep "LISTEN" ` |grep "3306" |awk -F[:""]+  '{print $4}' MYSQLIP = `ifconfig eth0` |grep "inet addr" |awk -F[:""]+ '{print $4}' STATUS = $(/usr/local/mysql/bin/mysql

mysql 慢日志分析脚本

#!/bin/bash # analysis the mysql slow log # Writen by landline #IPadd=`grep `hostname`  /etc/hosts | awk -F' '  'END{print $1}' ` IPadd=`/sbin/ifconfig eth0 |grep Bcast |awk -F: '{print $2}'|awk  '{print $1}' ` serverday=`date -d '-1 day'  +%Y-%m-%d`

mysql复制延迟监控脚本

#!/bin/sh #[email protected] #repdelay.sh #查看复制延迟具体多少event #####1.juede the rep slave status export black='\033[0m' export boldblack='\033[1;0m' export red='\033[31m' export boldred='\033[1;31m' export green='\033[32m' export boldgreen='\033[1;32m' e

mysql和nginx服务是否正常监控脚本

一.监控web服务器和mysql方法 1.监控端口(nginx也相同) 1.1本地监控 netstat -tunlp|grep 3306|wc -l ss -tunlp|grep 3306|wc -l 1.2远程监控 nmap 10.117.33.98 -p 3306|grep open|wc -l echo -e "\n"|telnet 10.117.33.98 3306 2>/dev/null |grep Connected|wc -l 2.监控进程(nginx同) ps -

MySQL的keepalived高可用监控脚本

MySQL的keepalived高可用监控脚本 MySQL(或者其它服务)的keepalived高可用监控脚本 开发脚本需求 :我们知道,keepalive是基于虚拟ip的存活来判断是否抢占master的机制的,但是如果我们做了MySQL的keepalived的高可用的时候,就要考虑一种情况的发生,那就是如果机器网卡并没有断,二十由于MySQL服务的不稳定,或者人为的误操作,导致的服务关闭,会引起的结果就是,keepalive并不会切换,因为并不是主master的虚拟ip不存在,而是服务已经停止