近期发现服务器上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 # 设置与 /etc/cron.hourly/ 相同的环境 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin export SHELL=/bin/bash export USER=root export LOGNAME=root export HOME=/root LOG_FILE="/home/wwwlogs/mysql_messages" pgrep -x mysqld &> /dev/null if [ $? -ne 0 ] then echo "`date` : MySQL is stop.">> $LOG_FILE service mysql start echo "`date` : MySQL server is re-started.">> $LOG_FILE else echo "`date` : MySQL server is running.">> $LOG_FILE fi
脚本文件上传完毕后,先试运行一下这个脚本,发现有报错
还需用VM打开这个脚本文件,输入命令
:set ff=unix
修改其格式,这个脚本才可以被自动执行。
然后运行以下命令生成一个空白的日志文件:
vim /home/wwwlogs/mysql_messages
然后退出VM即可。
如果想偷个懒还可以把此脚本直接存到/etc/cron.hourly/ 目录下,也要设置权限:
chmod +x /etc/cron.hourly/checkmysql.sh
这样每小时就会自动执行一次,不用修改crontab设置了。
隔一段时间检查一下mysql_messages是否有频繁的报错记录再决定是否给主机加配。
本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/2012.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。
