前段时间,主机的MySQL服务无缘无故会自动关闭,以前从没出过这种情况,于是看了下mysql的错误日志,如下所示:
以为是内存分配不够,便调大了内存,过了几天后,依然出现mysql服务自动关闭的情况,无奈之下,开始写了脚本监控mysql。
mysql的监控方式有多种,如,通过查看端口号和进程是否存在来检测mysql服务是否正常,或者通过端口和主机连接mysql,但当CPU负载很高时,会出现端口在服务可能不正常的情况,一般最佳方式为通过php/java程序进行 url 监控,然后在脚本中利用URL的返回值判断mysql服务是否正常,然后在执行其他操作。使用此方法时,需要在网站子目录中提供一个php或java监控程序。
一,通过php脚本进行 url 监控
1)在网站根目录下提供一个php脚本
[root@sta html]# cat php-mysql.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)