MySQL慢日志监控脚本

#!/bin/bash
# 本脚本用来在指定频率内监控 MySQL 慢日志的变化,并在发生增长时及时报警
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_POINT=$(($NEW_POINT-$OLD_POINT))
        #SUM_POINT=${SUM_POINT0#-}
                if [ $SUM_POINT == 0 ] ; then
                        continue
                else
                        sed -n "/.*/{${OLD_POINT},${NEW_POINT}p}" $MON_FILE > $DIFF_MON_FILE
                        if [[ -s $DIFF_MON_FILE ]];then
                                SUM_POINT=$[$SUM_POINT+1]
                                sed -i '1i 本次新增慢日志 '$SUM_POINT' 条'  $DIFF_MON_FILE
                            mail -s "[警告] 服务器 $(hostname) 产生 MySQL 慢日志 $SUM_POINT 条" $ADMIN_MAIL < $DIFF_MON_FILE
                                echo "$(<$DIFF_MON_FILE)"
                                > $DIFF_MON_FILE
                                echo $NEW_POINT > $MON_POINT_FILE
                        fi
        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
 

你可能感兴趣的:(脚本)