解决 MySQL 异常关闭的问题

2015/08/12 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实例。

Search

    Table of Contents