方法一:采用监听mysql端口和进程的方式
作为新手参考了些资料,代码如下:
#!/bin/bash
#liud
#function:监控mysql状态,出现异常则启动mysql
LOG_DIR=/data/monitor/
EMAIL_PATH=/server/scripts/email.txt
LOG_FILE=mysql_`date +%Y-%m-%d`.log
NowTime=`date +%Y-%m-%d_%H:%M:%S`
DB_PATH=/etc/init.d/mysql
# 日志目录不存在,则创建
[ ! -d $LOG_DIR ] && mkdir -p $LOG_DIR
# 查看mysql 3306的监听端口, wc -l转换成数字
portNum=`netstat -lnt|grep 3306|wc -l`
# 查看mysql的进程, wc -l转换成数字
mysqlProcessNum=`ps -ef|grep mysql|grep -v grep|wc -l`
if [ $portNum -eq 1 ] && [ $mysqlProcessNum -eq 2 ];then
# >>$LOG_DIR/$LOG_FILE 将mysql当前状态追加写入日志文件中
echo "${NowTime}, db is running." >>$LOG_DIR/$LOG_FILE
else
# >>$LOG_DIR/$LOG_FILE 将mysql当前状态追加写入日志文件中
echo "--${NowTime}, db is not running.--" >>$LOG_DIR/$LOG_FILE
# service mysql start >>$LOG_DIR/$LOG_FILE && status="success"||status="failure"
# 启动mysql
${DB_PATH} start>/dev/null
# 等待30秒查看状态
sleep 30
# 重新查看mysql的端口和进程
portNum=`netstat -lnt|grep 3306|wc -l`
mysqlProcessNum=`ps -ef|grep mysql|grep -v grep|wc -l`
if [ $portNum -ne 1 ] || [ $mysqlProcessNum -ne 2 ];then
# 重启失败,则暴力杀掉mysql的进程 杀完后$?会返回1,对应的是没有进程可杀了,跳出循环 再次启动mysql
while true
do
echo "${NowTime},killall mysqld.">>$LOG_DIR/$LOG_FILE
killall mysqld >/dev/null 2>&1
[ $? -ne 0 ] && break
sleep 1
done
#service mysql start 直接执行脚本可以启动,但是放在crond里面就不行,不明白为什么
${DB_PATH} start>/dev/null&& status="success"||status="failure"
else
status="success"
fi
# 将mysql启动状态追加写入日志文件
echo "${NowTime},mysql startup status is $status.">> $LOG_DIR/$LOG_FILE
#发送邮件提示
for email_num in `cat $EMAIL_PATH`
do
mail -s "${NowTime},mysql startup status is $status." $email_num <$LOG_DIR/$LOG_FILE
done
fi
以上脚本,存在的缺陷是,MySQL虽然启动了,但是不一定就能正常连接,比如挂载满了,数据库锁住了,等等.最好的方式就是模拟用户连接数据库是否能正常连接来判断数据库当前是否正常.后面会讲到.