MySQL 慢日志监控

 MySQL 慢日志

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

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 : [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!

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

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

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

你可能感兴趣的:(mysql)