公司线上的 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 "\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!

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

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

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

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

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

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

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

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

  1. shell监控脚本实例—监控mysql主从复制

    分享一例shell脚本,用于监测mysql数据库的主从复制,有需要的朋友不妨参考学习下. 转自:http://www.jbxue.com/article/14103.html(转载请注明出处) 本节内 ...

  2. tomcat错误日志监控脚本

    #!/usr/bin/env python #-*-coding:utf-8-*- #CreateDate:2017/04/14 #Author:Eivll0m #ScriptName:monitor ...

  3. mysql复制延迟监控脚本

    #!/bin/sh #ocpyang@126.com #repdelay.sh #查看复制延迟详细多少event #####1.juede the rep slave status export bl ...

  4. centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课

    centos   shell编程6一些工作中实践脚本   nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志  直接送给bc做计算  gzip  innobacku ...

  5. MySQL监控脚本

    zabbix监控mysql时自定key用到的脚本 #!/usr/bin/env python #-*- coding: UTF-8 -*- from __future__ import print_f ...

  6. shell脚本实例-系统监控

    shell脚本监控网站并实现邮件.短信报警shell进程监控脚本(发送邮件报警)Shell脚本监控服务器在线状态和邮件报警的方法 http://www.jbxue.com/jb/shell/ 11. ...

  7. Linux centosVMware 告警系统主脚本、告警系统配置文件、告警系统负载脚本、告警系统502日志脚本、告警系统disk监控脚本、告警系统邮件引擎

    一.告警系统主脚本 要求:我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件. 程序架构 ...

  8. 关于mysql和Apache以及nginx的监控脚本怎么写会比较好的记录

    最近,自己业务进行上线,上线后,需要考虑的是对各种服务进行监控,包括(httpd服务,mysqld服务等),现在想以mysqld服务为例总结下那种方式的脚本最为专业和合理: (1).根据mysql的端 ...

  9. 【mysql】使用脚本对mysql状态进行监控

    1.mysqladmin 使用mysqladmin extended-status命令可以获得所有MySQL性能指标,即show global status的输出,不过,因为多数这些指标都是累计值,如 ...

随机推荐

  1. Linux内核启动分析过程-《Linux内核分析》week3作业

    环境搭建 环境的搭建参考课件,主要就是编译内核源码和生成镜像 start_kernel 从start_kernel开始,才真正进入了Linux内核的启动过程.我们可以把start_kernel看做平时 ...

  2. nload 实时网速查看

    nload eth0 -u K Device eth0 [192.168.0.33] (1/1):=================================================== ...

  3. 【Android开发坑系列】之PopupWindow

    PopupWindow在4.0之前的版本有个系统级别的BUG,必须借助一段自定义的fix代码来修复.其中mPopPm就是PopupWindow实例.java.lang.NullPointerExcep ...

  4. Android 源码获取-----在Windows环境下通过Git得到Android源代码

    在学习Android的过程中,深入其源代码研究对我们来说是非常重要的,这里将介绍如何通过在Windows环境下使用Git来得到我们的Android源代码. 1.首先确保你电脑上安装了Git,这个通过  ...

  5. Java多线程(3) Volatile的实现原理

    Volatile变量 在程序设计中,尤其是在C语言.C++.C#和Java语言中,使用volatile关键字声明的变量或对象通常拥有和优化和(或)多线程相关的特殊属性.通常,volatile关键字用来 ...

  6. 数据导入读取read.table函数详解,如何读取不规则的数据(fill=T)

    函数 read.table 是读取矩形格子状数据最为便利的方式.因为实际可能遇到的情况比较多,所以预设了一些函数.这些函数调用了 read.table 但改变了它的一些默认参数. 注意,read.ta ...

  7. java观察者模式的实现

    在看博客里,有个订阅功能,当你订阅后,当博主发布新的博客,你都能收到消息.这是如何实现的?是不是后台有个线程在不停的轮询?如果是这样的话,显然太耗资源,如果当博客在发布时,找到所有的订阅者,然后循环的 ...

  8. leveldb - 并发写入处理

    在并发写入的时候,leveldb巧妙地利用一个时间窗口做batch写入,这部分代码值得一读: Status DBImpl::Write(const WriteOptions& options, ...

  9. 实现打印级别且带图片的Excel 方案

    导出二维数据excel,其实很简单,使用cvs就可以了.但是如果导出格式复杂带样式还带图片的怎么办?客户的要求有时就是这么变态.呵呵.如果使用.net,微软提供的有库,使用php好像也有现成的有库.我 ...

  10. javascript不用new关键字创建对象示例

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...