MySQL监控脚本

shell struggling 1445次浏览 0个评论

前段时间,主机的MySQL服务无缘无故会自动关闭,以前从没出过这种情况,于是看了下mysql的错误日志,如下所示:

QQ图片20160228101208

以为是内存分配不够,便调大了内存,过了几天后,依然出现mysql服务自动关闭的情况,无奈之下,开始写了脚本监控mysql。

mysql的监控方式有多种,如,通过查看端口号和进程是否存在来检测mysql服务是否正常,或者通过端口和主机连接mysql,但当CPU负载很高时,会出现端口在服务可能不正常的情况,一般最佳方式为通过php/java程序进行 url 监控,然后在脚本中利用URL的返回值判断mysql服务是否正常,然后在执行其他操作。使用此方法时,需要在网站子目录中提供一个php或java监控程序。

一,通过php脚本进行 url 监控

1)在网站根目录下提供一个php脚本

[root@sta html]# cat php-mysql.php 
<?php 
$link=mysql_connect('127.0.0.1','root','123456');     /*主机 用户 密码 */ 
if(!$link) echo "failed"; 
else echo "success"; 
?>

此脚本返回值为“failed”或者“success”。

2)定义脚本监控。

#/bin/bash

LogPath=/tmp/mysql.log

URL=www.tianfeiyu.com                                                                                                           

Result=`curl --connect-timeout 5 -s $URL/php-mysql.php`

ServiceScript=/etc/init.d/mysqld

LockFile=/var/lock/subsys/mysqld

[ -f $LogPath ] && > $LogPath || touch $LogPath

if [ "$Result" == "success" ];then
    echo -e "\033[32mdb is running.\033[0m" >> $LogPath
else
    echo -e "\033[32mdb is down , 正在尝试重新启动!\033[0m" >> $LogPath
    [ -e $LockFile ] && rm -f $LockFile    #删除锁文件

    [ -x $ServiceScript ] && $ServiceScript start >> $LogPath   

    sleep 3

    Result=`curl --connect-timeout 5 -s $URL/php-mysql.php`
        
    if [ "$Result" != "success" ];then
        echo -e "\033[32m重启失败,正在杀死服务尝试再次重启!\033[0m" >> $LogPath
        while true
        do
            killall mysqld &> /dev/null  
            [ $? -ne 0 ] && break   #杀尽会显示 mysqld: no process killed,此时$?不为0
            sleep 1 
        done
    $ServiceScript start >> $LogPath && status="successful"||status="failure"

    mail -s "mysqld startup status is $status" root@localhost.localdomain < $LogPath
             
    fi  
fi

说明:LogPath 脚本执行中产生的信息,URL使用主机或域名,Result是php脚本的返回信息,ServiceScript服务脚本,LockFile锁文件。

二,通过端口和进程进行监控

注意:文件名中不要使用mysql关键字。

#/bin/bash

LogPath=/tmp/mysql.log

portNum=`ss -ltn| grep 3306|wc -l`      #端口数

mysqlProcessNum=`ps -ef|grep mysqld |grep -v grep |wc -l`  #进程数,一般是2个,需要自己查看

LockFile=/var/lock/subsys/mysqld

ServiceScript=/etc/init.d/mysqld

[ -f $LogPath ] && > $LogPath || touch $LogPath

if [ $portNum -eq 1 -a $mysqlProcessNum -eq 2 ];then    

        echo -e "\033[32mdb is running.\033[0m" >> $LogPath
else
        echo -e "\033[32mdb is down , 正在尝试重新启动!\033[0m" >> $LogPath
            
        [ -e $LockFile ] && rm -f $LockFile

        [ -x $ServiceScript ] && $ServiceScript start >> $LogPath
        sleep 3

        portNum=`ss -ltn| grep 3306|wc -l`

        mysqlProcessNum=`ps -ef|grep mysqld |grep -v grep |wc -l`

        if [ $portNum -ne 1 -o $mysqlProcessNum -ne 2 ];then
                echo -e "\033[32m重启失败,正在杀死服务尝试再次重启!\033[0m" >> $LogPath
                while true
                do
                        killall mysqld &> /dev/null  
                        [ $? -ne 0 ] && break   #杀尽会显示 mysqld: no process killed,此时$?不为0
                        sleep 1 
                done
                $ServiceScript start >> $LogPath && status="successful"||status="failure"
                    
                mail -s "mysqld startup status is $status" root@localhost.localdomain < $LogPath
                    
        fi  
fi

然后让脚本运行在后台就可以正常工作了。


DevOps-田飞雨 》》转载请注明源地址
喜欢 (1)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址