首页 > LNMP >

LNMP使用中mysql宕机挂掉后自动重启脚本

  

昨晚某个重要网站的mysql挂掉了,今早睡了个懒觉,发现出问题时已经整整过去7个小时,美刀打水漂了

以前就一直要弄个脚本来自动重启,但是一直没出过问题,人就变懒了

不行,这次还是弄个无人值守的脚本帮我时时刻刻监视服务器mysql吧

我采用的脚本:
1)先检测MYSQL的3306端口是否正常(第一句);
2)不正常,将检查发生错误的事件写入日志,并重启mysql。
WordPress博客写入和读取并发较大时容易出现mysql服务挂掉,以下是老牛自己用的自动重启WordPress脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
pgrep -x mysqld &> /dev/null
if [ $? -ne 0 ]
then
    echo "MySQL stoped at time: `date` ">> /home/wwwlogs/mysql_messages
    /etc/init.d/mysql restart
    sleep 15s
        MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $4}'`
        if [ "$MYSQLPORT" == "3306" ]
        then  
            echo "MySQL restart successful at time: `date` ">> /home/wwwlogs/mysql_messages  
        else
            echo "MySQL restart failed at time: `date` ">> /home/wwwlogs/mysql_messages
            mail -s "wann! yourwebsitedomain's mysql restart failed" 这里写你的邮箱地址
        fi
else
    echo "MySQL server is running"

也可以用另外两个方式来监视mysql的端口

1
/usr/bin/nmap localhost | grep 3306

1
lsof -i:3306

不同的操作系统'{print $5}'处可能不一样,请各人自己测试
如果采用的第一种方式,需要安装nmap
--------------------------------------------------------------------------------
上述shell脚本写好后,添加执行权限和定时任务即可
添加shell脚本执行权限

1
chmod +x /root/mysqllisten.sh

添加定时任务(5分钟检查一次)

1
2
3
4
5
crontab -e

*/10 * * * * /bin/bash /root/mysqllisten.sh

service crond restart

另在网上找了个更加完善的脚本,但是我没用,也既记录下
1)先检测MYSQL的3306端口是否正常;
2)使用帐号连接数据库并执行show databases命令;
3)如以上两点都能正常工作则表示数据库运行正常,不正常则记录日志并重启,重启不成功使用Email通知管理人员。

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
#!/bin/bash  
#/usr/bin/nmap localhost | grep 3306  
#lsof -i:3306  
MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $5}'`  
 
function checkMysqlStatus(){  
    /usr/bin/mysql -uroot -p11111 --connect_timeout=5 -e "show databases;" &>/dev/null 2>&1  
    if [ $? -ne 0 ]  
    then  
        restartMysqlService  
        if [ "$MYSQLPORT" == "3306" ];then  
            echo "mysql restart successful......"  
        else  
            echo "mysql restart failure......"  
            echo "Server: $MYSQLIP mysql is down, please try to restart mysql by manual!" > /var/log/mysqlerr  
            #mail -s "WARN! server: $MYSQLIP  mysql is down" admin@yourdomain.com < /var/log/mysqlerr  
        fi  
    else  
        echo "mysql is running..."  
    fi  
}  
 
function restartMysqlService(){  
    echo "try to restart the mysql service......"  
    /bin/ps aux |grep mysql |grep -v grep | awk '{print $2}' | xargs kill -9  
    service mysql start  
}  
 
if [ "$MYSQLPORT" == "3306" ]  
then  
    checkMysqlStatus  
else  
    restartMysqlService  
fi

  •   正在提交中,请稍候...
      评论提交成功
    回复 的评论,点击取消回复