解决 MySQL 异常关闭的问题
临时解决了一个MySQL异常关闭的问题,这里记录一下。
测试环境的数据库经常出现异常关闭的情况。因为是测试环境,所以没有针对测试环境做一些高可用的容灾措施。因此临时的解决办法是通过后台脚本来监控MySQL进程的活动情况,当发现MySQL进程关闭的时候,立即重启MySQL进程。这个脚本的思路非常简单,就是不断的检查MySQL的数据库后台进程的运行情况,一旦发现MySQL数据库后台进程异常关闭,立即重新启动数据库,这样可以在不增加硬件投入成本的情况下,提高数据库的可用性,下面是监控脚本:
#!/bin/bash
# 脚本功能
# 每2分钟检测一次MySQL实例的运行状态,如果实例不存在,则重启
# 作者:light.zhang
# 命令路径
MYSQL_SCRIPTS="/usr/local/mysql/support-files/mysql.server"
# 命令时间间隔
RUN_INTERVAL=120
# 进程名
PROCESS_NAME="mysqld"
# 输出日志目录
LOGDIR="$HOME/log.txt"
for (( ; ; ))
do
sleep $RUN_INTERVAL
PID="$(ps aux | grep $PROCESS_NAME | grep -v grep | awk '{print $2}')"
if [ "$PID" = "" ]; then
echo -n "$(date '+%Y-%m-%d %H:%M:%S')" >> $LOGDIR
echo " mysqld has down, now try to startup" >> $LOGDIR
"$MYSQL_SCRIPTS" start >> $LOGDIR
else
echo "$(date '+%Y-%m-%d %H:%M:%S') OK" >> $LOGDIR
fi
done
这样确实在一定程度上解决了MySQL数据库异常关闭的问题,但是运行一段时间以后,这个脚本突然不能正常工作,原因是上面的脚本在单实例MySQL的情况下,是可以正常工作的,但是如果切换到多实例的情况下,由于该脚本是按照MySQL的进程名称来判断MySQL的后台进程是否存活,所以上面的脚本只能保证一个实例可以正常工作,那么有没有办法同时检测两个实例呢?当然有,我们可以根据不同实例的端口号来判断实例的存活状态,修改脚本如下:
#!/bin/bash
# 脚本功能
# 每2分钟检测一次MySQL实例的运行状态,如果实例不存在,则重启
# 作者:light.zhang
# 命令路径
MYSQL_SCRIPTS="/usr/local/mysql/support-files/mysql.server"
# 命令时间间隔
RUN_INTERVAL=120
# 进程名
PROCESS_PORT="3307"
# 输出日志目录
LOGDIR="$HOME/log.txt"
for (( ; ; ))
do
sleep $RUN_INTERVAL
PID="$(ps aux | grep $PROCESS_PORT | grep -v grep | awk '{print $2}')"
if [ "$PID" = "" ]; then
echo -n "$(date '+%Y-%m-%d %H:%M:%S')" >> $LOGDIR
echo " mysqld has down, now try to startup" >> $LOGDIR
"$MYSQL_SCRIPTS" start >> $LOGDIR
else
echo "$(date '+%Y-%m-%d %H:%M:%S') OK" >> $LOGDIR
fi
done
以上脚本稍作调整即可用来监控多个MySQL实例。