登录
  • 欢迎访问悠扬的技术博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站😉

Linux运维之Shell脚本处理-mysql主从状态监控异常脚本处理

centos7 悠扬 95次浏览 已收录 0个评论

Linux运维之Shell脚本处理-mysql主从状态监控异常脚本处理

1.场景说明

      本章内容直接上干货,和我一起从0开始编写一个满足自己要求的shell脚本,通过脚本来监控mysql主从同步状态。发送通知邮件给自己,异常状态实时通知。

场景需求如下:

  1. 通过脚本监控mysql主从库同步状态,获取状态码,错误信息
  2. 配置可进行自动判断跳过的同步错误码,根据错误码进行异常跳过
  3. 通过异常状态码监控无法恢复的错误
  4. 通过不同状态获取错误信息,进行邮件发送
  5. 配置邮件模板,根据状态码写入不同的通知邮件内容
  6. 通过定时任务配置脚本执行
  7. 配置mysql安全登录方式执行命令
  8. 邮箱发送配置

     题外话:本章内容适合和我一样不是专业运维人员的开发人员,记录是为了下一次能够在此基础上更好的编写脚本,实现自己的需求功能,如有运维大大看到,请多多指教,有些内容可能并不完美,但以实现功能需求为第一目的。

2.优先需要了解的技术内容

  1. shell语法  if  for 结构化命令
  2. shell变量数组使用
  3. cat mail echo egrep awk 管道  重定向
  4. mysql主从状态、错误码

3.下面开始我人生中第一个shell脚本

说说以下脚本都实现了什么:

  1. 获取mysql主从同步状态
  2. 获取错误信息
  3. 判断错误进行自动化脚本处理,可以进行部分错误系统自动修正
  4. 错误信息输出到错误文件
  5. 根据状态发送邮件到自己邮箱
#!/bin/bash
msg="Mysql Slave is Downed"
error_code=(1158 1159 1008 1007 1062)
mysql_cmd="mysql -u root -pxxx"
mha_state=false
$mysql_cmd -e "show slave status\G;" |egrep '_Running|Last_SQL'|awk -v FS=":" '{print $N}' > /home/sql_error.txt
array=($($mysql_cmd -e "show slave status\G;" |egrep '_Running|Last_SQL_Errno|Last_'|awk '{print $NF}'))
if [ "${array[0]}" == "Yes" -a "${array[1]}" == "Yes" -a "${array[2]}" == "0" ]
then
    echo "Mysql Slave is running"
else
    for (( i = 0; i < n; i++ )); do
      if [ "${array[3]}" == "${error_code[$i]}" ]; then
          $mysql_cmd -e "stop slave;set global sql_slave_skip_counter=1;start slave;"
          echo "=========执行自动恢复计划任务执行===========" >> /home/sql_error.txt
          mail -s "$msg" xxx@qq.com < /home/sql_error.txt
          cat "" > /home/sql_error.txt
          $mha_state=true
      fi
    done
    #echo "$msg"|mail -s "$msg" xxx@qq.com
    if [ "${mha_state}" == "false" ]; then
        echo "=========异常错误无法进行自动恢复,请尽快登录处理===========" >> /home/sql_error.txt
        mail -s "$msg" xxx@qq.com < /home/sql_error.txt
        cat "" > /home/sql_error.txt
    fi

fi

需要优化的部分:

  1. mysql安全性,密码写在脚本里面不够安全
  2. 结构混乱功能混杂,需要进行函数编写
  3. 没有配置定时任务到服务器进行监控(不建议脚本进行死循环sleep这种处理方式)

4.最终使用脚本及配置方式

  1. 最终脚本
    #!/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin
    export PATH
    msg="Mysql Slave is Downed"
    error_code=(1158 1159 1008 1007 1062)
    mysql_cmd="mysql --login-path=pathA"
    mha_state=false
    $mysql_cmd -e "show slave status\G;" |egrep '_Running|Last_SQL'|awk -v FS=":" '{print $N}' > /home/sql_error.txt
    array=($($mysql_cmd -e "show slave status\G;" |egrep '_Running|Last_SQL_Errno|Last_'|awk '{print $NF}'))
    
    #这里注意使用的全局变量
    function slaveErrorAutomaticRecovery() {
        for (( i = 0; i < n; i++ )); do
          if [ "${array[3]}" == "${error_code[$i]}" ]; then
              $mysql_cmd -e "stop slave;set global sql_slave_skip_counter=1;start slave;"
              echo "=========执行自动恢复计划任务执行===========" >> /home/sql_error.txt
              cat /home/sql_error.txt |mail -s "${msg}" 425155363@qq.com >/dev/null
              cat /dev/null > /home/sql_error.txt
              mha_state=true
          fi
        done
    
    }
    
    
    function slaveErrorCannotBeRecovered() {
      if [ "$1" == "false" ]; then
          echo "=========异常错误无法进行自动恢复,请尽快登录处理===========" >> /home/sql_error.txt
          #>/dev/null 加这个是为了不让mail输出到控制台,这玩意一直报Unknown command: "et" 用什么方式都解决交不了
          cat /home/sql_error.txt |mail -s "${msg}" 425155363@qq.com >/dev/null
          cat /dev/null > /home/sql_error.txt
      fi
    
    }
    
    if [ "${array[0]}" == "Yes" -a "${array[1]}" == "Yes" -a "${array[2]}" == "0" ]
    then
        echo "Mysql Slave is running"
    else
      slaveErrorAutomaticRecovery
      slaveErrorCannotBeRecovered $mha_state
    fi
  2. mysql安全登录设置
    #设置登录
    mysql_config_editor set --login-path=pathA --host=localhost --user=root --password --port=3306 
    #登录
    mysql --login-path=pathA
    #重置
    mysql_config_editor reset
    #打印配置信息
    mysql_config_editor print --all

5.配置定时任务做守护进程定时执行

crontab -e   #这里有什么问题记得找百度
* */1 * * * /bin/bash /home/mysql_mha.sh

版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Linux运维之Shell脚本处理-mysql主从状态监控异常脚本处理
喜欢 (0)
支付宝[]
分享 (0)
悠扬
关于作者:
10年以上工作经验,从事2年微服务架构搭建工作,有大数据处理相关工作经验,使用spring全家桶包括:Spring,SpringBoot,SpringCloud 数据层组件服务使用SpringDataJpa,Mybatis以及其他第三方组件Sharding-JDBC,Sharding-Proxy分库分表。熟悉微服务,服务降级,限流,分流,做过项目源码修改,有cat,apollo,nacos使用经验,有Lostash,Elasticsearch,kibana,mysqlMHA生产实践经验,使用开源代码Apache Sarding项目,修改源码支持mysql分库分表使用年月日小时分库分表,docker做集群服务,Jekins做项目发布,GitLab做项目管理,使用docker容器部署,熟悉消息队列RabbitMQ,Kafka,ActiveMQ。RuoYi-Vue-Atomikos项目开源加入生态圈组件,项目支持分布式事务,界面添加多数据源,数据源动态配置,切面切换,多数据源事务支持,支持区域数据源配置,用于区域数据切分,数据层次分库。项目地址:https://gitee.com/zsiyang/ruoyi-vue-atomikos
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址