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=274546888@qq.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 #-}
         sed  -n  "$OLD_POINT,${NEW_POINT}p"  $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博友有所帮助!










本文转自 aaao 51CTO博客,原文链接:http://blog.51cto.com/nolinux/1577326,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
Prometheus 监控 Cloud Native
基于docker搭建监控系统&日志收集
Prometheus 是一款由 SoundCloud 开发的开源监控报警系统及时序数据库(TSDB),支持多维数据模型和灵活查询语言,适用于大规模集群监控。它通过 HTTP 拉取数据,支持服务发现、多种图表展示(如 Grafana),并可结合 Loki 实现日志聚合。本文介绍其架构、部署及与 Docker 集成的监控方案。
998 122
基于docker搭建监控系统&日志收集
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
996 1
日志收集和Spring 微服务监控的最佳实践
|
监控 测试技术 Go
告别传统Log追踪!GOAT如何用HTTP接口重塑代码监控
本文介绍了GOAT(Golang Application Tracing)工具的使用方法,通过一个Echo问答服务实例,详细展示了代码埋点与追踪技术的应用。内容涵盖初始化配置、自动埋点、手动调整埋点、数据监控及清理埋点等核心功能。GOAT适用于灰度发布、功能验证、性能分析、Bug排查和代码重构等场景,助力Go项目质量保障与平稳发布。工具以轻量高效的特点,为开发团队提供数据支持,优化决策流程。
1058 90
|
12月前
|
存储 缓存 监控
用 C++ 红黑树给公司电脑监控软件的日志快速排序的方法
本文介绍基于C++红黑树算法实现公司监控电脑软件的日志高效管理,利用其自平衡特性提升日志排序、检索与动态更新效率,并结合实际场景提出优化方向,增强系统性能与稳定性。
268 4
|
12月前
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
388 6
|
存储 弹性计算 关系型数据库
如何通过控制台创建RDS MySQL实例
本文介绍了通过控制台创建RDS MySQL实例的详细步骤,包括准备工作、选择计费方式、地域、实例规格、存储空间等关键配置,并指导用户完成下单与实例查看。
|
存储 关系型数据库 MySQL
【赵渝强老师】MySQL数据库的多实例环境
MySQL多实例是指在一台服务器上运行多个MySQL服务,通过不同端口提供独立的数据服务。各实例共享安装程序,但使用各自的配置文件和数据文件,实现资源高效利用。本文详细介绍了如何通过“mysqld_multi”工具配置和启动多个MySQL实例,并演示了目录创建、初始化、配置文件修改及实例启动等操作步骤。
553 1
|
关系型数据库 MySQL Linux
实现MySQL数据库的定时自动备份脚本。
拿走,不谢,这个脚本配方(指引)保证你的数据库数据像蛋糕店一样地天天更新,还能确保老旧的蛋糕(数据)不会堆积满仓库。这下可好,数据安全有保障,数据库管理员也能轻松一点,偶尔闲下来的时候,煮杯咖啡,看个剧岂不美哉?别忘了偶尔检查一下你的自动备份是否正常工作,以防万一蛋糕机器出了点小差错。
1019 20
|
SQL 监控 关系型数据库
MySQL日志分析:binlog、redolog、undolog三大日志的深度探讨。
数据库管理其实和写小说一样,需要规划,需要修订,也需要有能力回滚。理解这些日志的作用与优化,就像把握写作工具的使用与运用,为我们的数据库保驾护航。
1023 23

推荐镜像

更多