linux shell mysql 数据库主从同步状态检查告警,mysql告警


需求: 1、监测数据库主从状态 2、获取数据库主要参数 3、可读取配置文件 4、部署位置自适应。   参考资料: http://blog.csdn.net/yf210yf/article/details/9207147 http://blog.csdn.net/lllxy/article/details/3423580 http://www.jb51.net/article/53022.htm http://www.2cto.com/os/201307/225515.html   #全局变量包括程序路径,bin文件路径,时间,发送短信数据库配置 #!/bin/bash #获取shell脚本执行路径 DIR="$( cd "$( dirname "$0"  )" && pwd  )"
BINPATH=`echo $DIR | sed -e 's/\/bin//'`
TIME=`date "+%Y-%m-%d %H:%M:%S"` #数据库连接,用于短信发送
SQLPARAM_SMS="mysql -uXXXX -pXXXX -h192.168.1.1"   #读取配置文件,并获取同步状态 #配置文件的内容和格式可以看我上一篇博文,另外直接看命令也可以分析出来 while read LINE
do
CHOST=`echo $LINE | awk -F ':' '{print $2}'`
DBNAME=`echo $LINE | awk -F ':' '{print $1}'`
SQLPARAM="mysql -h$CHOST -uroot -pdascom" #获取从库同步状态,并输出至临时文件,当然也可以直接处理
$SQLPARAM < $DIR/status.sql > $DIR/temp.log
REIO=`grep Slave_IO_Running $DIR/temp.log | awk -F ': ' '{print $2}'` RESQL=`grep Slave_SQL_Running $DIR/temp.log | awk -F ': ' '{print $2}'` #判断同步状态,并将结果输出至临时文件 #if判断,没啥好说的,具体的使用方法可以看我全面发出的参考资料链接 if [ "$REIO"x = "Yes"x -a "$RESQL"x = "Yes"x ];then
echo $TIME " ""Check '$DBNAME' is OK." >> $BINPATH/log/check.log
echo -e "0\c" >> $DIR/status.txt
else
echo $TIME " ""Check '$DBNAME' is down." >> $BINPATH/log/check.log
echo -e "$DBNAME \c" >> $DIR/status.txt
fi
done<$BINPATH/etc/chslave.conf   #对结果进行分析,如有异常发出短信告警 if grep -q "DB" $DIR/status.txt
then
sed -i "s/0//g" $DIR/status.txt
ERRDB=`sed -n 1p $DIR/status.txt`
echo "
set names 'gbk';
insert into ultrax.msgsend (service, srcNo, destNo,  msgcontent) values ('30', '10000', '18612255693', '$ERRDB mysql_slave is down.');
" > $DIR/temp.sql
$SQLPARAM_SMS < $BINPATH/bin/temp.sql
else
echo $TIME " All DB is ok!" >> $BINPATH/log/check.log
fi   #删除临时文件 rm -rf $DIR/status.txt $DIR/temp.log $DIR/status.txt $DIR/temp.sql   PS:这里解释个相当弱爆,但是也是些微的书写思路的问题。     之所以,发送告警短信的if循环是在while循环外面,是因为考虑到:我需要检查多个DB的状态,如果每次循环都去判断发短信的话会造成 两个问题:      1、如果多个DB出现问题,会瞬间发出多条短信,而短信平台会屏蔽短时间内连续向一个号码发送短信的行为。      2、浪费,不能因为更容易写就浪费短信。   当然,这个脚本还是一个比较弱爆的功能,我继续努力。

相关内容