0

说来惭愧,有一个小站,历历数载,部分下载数据也已经丢失,近期重启后,发现部署在LNMP上面的时候,网站无故总是提示数据库连接失败,一检查,发现数据库已经停用了,换了不同版本,多台vps,仍然不见效,索性就引用了老牛写好的自动重启脚本,提供给大家参考。

脚本的大致思路如下:

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

#!/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 “warn!Tuji8’s mysql restart failed” Õxzf7785@163.com
fi
else
echo “MySQL server is running”
fi

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

/usr/bin/nmap localhost | grep 3306

lsof -i:3306

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

chmod +x /root/mysqllisten.sh

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

crontab -e

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

service crond restart

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

#!/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

 

期待你一针见血的评论,Come on!