zoukankan      html  css  js  c++  java
  • 监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员

    企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:
    阶段1:开发一个守护进程脚本每30秒实现检测一次。
    阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误。
    阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分)

    此题来自:http://oldboy.blog.51cto.com/2561410/1632876

    解答参考1:

    #!/bin/sh
    #oldboy linux training
    #2015-05-17
    #说明:本脚本来自老男孩linux21期学员张耀开发!
    # Source function library.
    . /etc/init.d/functions
    
    # Defined variables
    MysqlUser=root
    MysqlPass=oldboy123
    MysqlPort=3307
    Mysqlsock=/data/$MysqlPort/mysql.sock
    ErrorNo=(1158 1159 1008 1007 1062)
    errorlog=/tmp/error_skip.log
    MysqlCmd="/application/mysql/bin/mysql -u$MysqlUser -p$MysqlPass -S $Mysqlsock"
    
    # Judge mysql server is ok?
    [ -S $Mysqlsock ] ||{
    	echo "Maybe MySQL have someting wrong"
    	exit 1
    }
    
    # Defined skip error Functions
    function error_skip(){
    	local flag
    	flag=0
    	for num in ${ErrorNo[@]}
    	  do
    	    if [ "$1" == "$num" ];then
    	       $MysqlCmd -e'stop slave;set global sql_slave_skip_counter=1;start slave;'
    	       echo "$(date +%F_%R) $1" >>$errorlog
    	    else
               echo "$(date +%F_%R) $1" >>$errorlog
    	       ((flag++))
    	    fi
    	done
    	[ "$flag" == "${#ErrorNo[@]}" ] &&{
    		action "MySQL Slave" /bin/false
    		uniq $errorlog|mail -s "MySQL Slave is error" 12345678@qq.com
    	}
    }
    
    # Defined check slave Functions
    function check_slave(){
    	MyResult=`$MysqlCmd -e'show slave statusG'|egrep '_Running|Behind_Master|SQL_Errno' |awk '{print $NF}'`
    	array=($MyResult)
      if [ "${array[0]}" == "Yes" -a "${array[1]}" == "Yes" -a "${array[2]}" == "0" ]
        then
        action "MySQL Slave" /bin/true
      else
        error_skip ${array[3]}
      fi
    }
    
    # Defined main Functions
    function main(){
    	while true
    	   do
    	     check_slave
    	     sleep 60
    	done
    }
    main
     

    解答参考2:

    #!/bin/sh
    #oldboy linux
    #2015-05-17
    #说明:本脚本来自老男孩教育21期学员李新宇!
    USER=root
    PASSWORD=123456
    PORT=3307
    error=(1158 1159 1008 1007 1062)
    MYSQLCMD="mysql -u$USER -p$PASSWORD -S /data/$PORT/mysql.sock"
    
    is_run(){
      [ `lsof -i:$PORT|wc -l` -lt 2 ]&&{
        echo "mysql server is stopped"
        exit 1
      }
    }
    
    status_array(){
     status=($($MYSQLCMD -e "show slave statusG"|egrep "_Running|Last_Errno|Behind_Master"|awk '{print $NF}'))
    }
    
    status_error(){
    for((i=0;i<${#error[*]};i++))
    do
      if [ "$1" == "${error[$i]}" ]
        then
          $MYSQLCMD -e "stop slave;set global sql_slave_skip_counter=1;start slave;"
      else 
          echo "MySQL slave is failed, errorno is $1"
      fi
    done
    }
    
    judge_slave(){
      status_array
      if [ "${status[0]}" == "Yes" -a "${status[1]}" == "Yes" -a "${status[3]}" = "0" ]
      then
        echo "MySQL slave is ok"
      else
        status_error ${status[2]}
      fi
    }
    
    main(){
    while true
    do
      is_run
      judge_slave
      sleep 60
    done
    }
    main
     

    老男孩老师提示:企业实际场景,还可能根据主库写时间戳的方式更严格的判断数据库是否同步

  • 相关阅读:
    python 学习 3-1 (编码)
    mongdb备份
    docker 部署redis , mongodb ,rabbitmq
    python学习第一天第二天总结
    python 学习 (1-3)
    python学习(day1-2)
    Activiti工作流搭建教程
    docker Compose安装
    CAS 单点登录(代码部分)
    推送自定义docker镜像到阿里云
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/14062008.html
Copyright © 2011-2022 走看看