前段时间,主机的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 <?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
然后让脚本运行在后台就可以正常工作了。