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 "\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 ]] && USAGEficase $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慢日志监控脚本实例剖析的更多相关文章
- shell监控脚本实例—监控mysql主从复制
分享一例shell脚本,用于监测mysql数据库的主从复制,有需要的朋友不妨参考学习下. 转自:http://www.jbxue.com/article/14103.html(转载请注明出处) 本节内 ...
- tomcat错误日志监控脚本
#!/usr/bin/env python #-*-coding:utf-8-*- #CreateDate:2017/04/14 #Author:Eivll0m #ScriptName:monitor ...
- mysql复制延迟监控脚本
#!/bin/sh #ocpyang@126.com #repdelay.sh #查看复制延迟详细多少event #####1.juede the rep slave status export bl ...
- centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课
centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobacku ...
- MySQL监控脚本
zabbix监控mysql时自定key用到的脚本 #!/usr/bin/env python #-*- coding: UTF-8 -*- from __future__ import print_f ...
- shell脚本实例-系统监控
shell脚本监控网站并实现邮件.短信报警shell进程监控脚本(发送邮件报警)Shell脚本监控服务器在线状态和邮件报警的方法 http://www.jbxue.com/jb/shell/ 11. ...
- Linux centosVMware 告警系统主脚本、告警系统配置文件、告警系统负载脚本、告警系统502日志脚本、告警系统disk监控脚本、告警系统邮件引擎
一.告警系统主脚本 要求:我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件. 程序架构 ...
- 关于mysql和Apache以及nginx的监控脚本怎么写会比较好的记录
最近,自己业务进行上线,上线后,需要考虑的是对各种服务进行监控,包括(httpd服务,mysqld服务等),现在想以mysqld服务为例总结下那种方式的脚本最为专业和合理: (1).根据mysql的端 ...
- 【mysql】使用脚本对mysql状态进行监控
1.mysqladmin 使用mysqladmin extended-status命令可以获得所有MySQL性能指标,即show global status的输出,不过,因为多数这些指标都是累计值,如 ...
随机推荐
- new一个Object对象占用多少内存?
Java的自动内存管理机制省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是G1的出现,改善了垃圾回收中stop the world的状况. 也许很多人都没有考虑过这 ...
- iOS5可能会删除本地文件储存 - Caches 也不安全
转自:http://blog.163.com/ray_jun/blog/static/1670536422011101225132544/ 出处:http://superman474.blog.163 ...
- C#中Math.Round()实现中国式四舍五入
C#中Math.Round()实现中国式四舍五入 C#中的Math.Round()并不是使用的"四舍五入"法.其实在VB.VBScript.C#.J#.T-SQL中Round函数都 ...
- 转:最简单的视频网站(JavaEE+FFmpeg)
本文记录一个最简单的视频网站系统.此前做过一些基于JavaEE中的 SSH (Strut2 + Spring + Hibernate)的网站系统,但是一直没有做过一个视频网站系统,所以就打算做一个&q ...
- 创建一个Windows的NTP Server
搭建一个VMware vRealize Suite的时候遇见了不少时间同步的问题, 实验室里网络与外界隔绝, 不能使用公网的NTP服务器, 所以使用文中的方法自己搭建了一个. 蛮好用的. Creati ...
- bash可改动的环境变量
环境变量名 变量的用途 CDPATH 包括cd命令要逐个查找的路径,cd命令在这些路径下查找作为參数传递给它的文件夹名.假设CDPATH没有设置,cd命令则查找当前文件夹 EDITOR 用户在程序中使 ...
- old header
海纳百川 山不拒土 No Backspace in Real Life. Love Life![Cloud][LBS][GIS][GPS][MAPS][C++][Java]
- GoldenGate 配置extract,replicat进程自启动
在GoldenGate中主进程是manager进程,使用start mgr启动.可以在mgr进程中添加一些参数用来在启动mgr进程的同时启动extract和replicat进程 GGSCI (gg01 ...
- spring中配置了事务,数据业务层捕获异常,事务配置不成功?
原理:spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常 ...
- Entity Framework: Joining in memory data with DbSet
转载自:https://ilmatte.wordpress.com/2013/01/06/entity-framework-joining-in-memory-data-with-dbset/ The ...