首页 > 代码库 > MySQL慢日志监控脚本实例剖析
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 ]] && 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慢日志监控脚本实例剖析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。