zoukankan      html  css  js  c++  java
  • linux shell 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、浪费,不能因为更容易写就浪费短信。
     
    当然,这个脚本还是一个比较弱爆的功能,我继续努力。
  • 相关阅读:
    maven_常用命令
    tomcat_server.xml常用配置
    tomcat线程池原理
    Tomcat处理HTTP请求原理&线程池
    javaweb-javaScript(一)
    javaweb-html快速入门
    javaweb-css
    javaweb-单元测试与注解
    javaweb-文件的上传下载
    javaweb-jsp开发模式+JSON插件
  • 原文地址:https://www.cnblogs.com/liujian001/p/5029858.html
Copyright © 2011-2022 走看看