检查LNMP上MySQL宕机并自动重启服务的脚本和使用方式

近期发现服务器上MySQL又经常宕机了,平均每周一次,应该和最近新挂上去的几个WordPress网站有关,毕竟一台配置不算豪华的主机上挂了10个WP网站,压力太大难免会内存不够造成宕机。每次宕机都需要自己重启MySQL也比较麻烦,如果是客户自己发现的,感觉更不好,所以网上找了个无人值守的脚本先用起来。

首先先建立一个脚本文件checkmysql.sh,内容如下

#!/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" xxx@xxx.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

以上xxx@xxx.com替换成自己的邮箱地址,如果MySQL重启失败可以收到提醒邮件。

把该文件上传到服务器上,我的对应位置是/root/lnmp1.4/tools/checkmysql.sh
之所以上传这个位置是因为这里还存放了lnmp作者写的其他几个维护脚本,以后找起来也方便

上传完毕后,打开服务器上的/etc/crontab 定时任务文件,在最底下加一行并保存,我设置了每20分检查一次:

*/20 * * * * root /bin/bash /root/lnmp1.4/tools/checkmysql.sh

然后添加这个脚本文件的执行权限,命令
chmod +x /root/lnmp1.4/tools/checkmysql.sh

最后重启一下定时任务:
service crond restart

大功告成。过段时间再回来看看日志文件,是否宕机频繁,如果重启的比较多,就要给云主机加配置咯!

Linux计划任务相关知识我参考了这个链接:https://www.cnblogs.com/xd502djj/p/4292781.html
----------------------
2019年10月14日更新
复盘以上这篇文章,由于checkmysql脚本是网上抄的,并没有好好验证过邮箱是否能发送邮件。其实是不能发送的,因为现在服务器的这个功能其实一直是被严控以防止乱用。于是换一个简单点的脚本:

#!/bin/bash
pgrep -x mysqld &> /dev/null
if [ $? -ne 0 ]
then
echo "At time: `date` :MySQL  is stop .">> /home/wwwlogs/mysql_messages
service mysql start
#echo "At time: `date` :MySQL server is stop."
else
echo "MySQL server is running ."
fi

然后运行以下命令生成一个空白的日志文件:

vim /home/wwwlogs/mysql_messages

然后退出VM即可。

如果想偷个懒还可以把此脚本直接存到/etc/cron.hourly/ 目录下,这样每小时就会自动执行一次,不用修改crontab设置了。

隔一段时间检查一下mysql_messages是否有频繁的报错记录再决定是否给主机加配。

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/2012.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

如本文对你有用,请在页面右侧栏扫码领取我的支付宝红包,作为打赏吧 (喂到底是我赏你还是你赏我啊-_-!)

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

发表评论

电子邮件地址不会被公开。 必填项已用*标注