mysql-shell监控mysql从同步

37 阅读2分钟

1.使用钉钉

方法1(已经实现)

Mysql版本5.7.34
必须注意执行脚本的用户需要使用mysql,如果使用root可能报错,使用定时任务执行即可。

#!/bin/bash
#check MySQL_Slave Status
#crontab time 00:10
a=`hostname`
MYSQLIP=`ifconfig eth0 | awk NR==2'{print $2}'`
DING_TOKEN='https://oapi.dingtalk.com/robot/send?access_token=用自己的token'
USER=root
PASSWD=用自己的
STATUS=$(mysql -u$USER -p$PASSWD -h $MYSQLIP -e "show slave status\G" | grep -i "running:")
IO_env=`echo  "$STATUS" | grep IO | awk  ' {print $2}'`
SQL_env=`echo  "$STATUS" | grep SQL | awk  '{print $2}'`
DATA=`date +"%y-%m-%d %H:%M:%S"`

if [ "$IO_env" == "Yes" -a "$SQL_env" == "Yes" ]
then
    echo "Slave is running!" >/dev/null
    #curl $DING_TOKEN \
    #   -H 'Content-Type: application/json' \
    #   -d '{"msgtype": "text","text": {"content": "钉钉业务告警---warn! 【'$MYSQLIP'-'`hostname`'】:MySQL Slave is running."}}'
else
    curl $DING_TOKEN \
       -H 'Content-Type: application/json' \
       -d '{"msgtype": "text","text": {"content": "钉钉业务告警---warn! 【'$MYSQLIP'-'`hostname`'】:MySQL Slave is not running."}}'
       #  echo "slave is error"
fi

方法2(供参考)

#!/bin/bash
Slave=$(mysql -uroot -pYdfoie#df1213% -e 'show slave status\G' 2>/dev/null |grep -E "Slave_IO_Running|Slave_SQL_Running"|awk '{print $2}'|grep -c Yes)
if [ "$Slave" -eq 2 ] ;then
         echo "mysql Slave is running" >/dev/null
#        curl $DING_TOKEN \
#        -H 'Content-Type: application/json' \
#        -d '{"msgtype": "text","text": {"content": "钉钉业务告警---warn! 【'`hostname`'】:MySQL Slave is running."}}'
else
        curl $DING_TOKEN \
        -H 'Content-Type: application/json' \
        -d '{"msgtype": "text","text": {"content": "钉钉业务告警---warn! 【'`hostname`'】:MySQL Slave is not running."}}'
fi

方法3

#!/bin/bash

DING_TOKEN='https://oapi.dingtalk.com/robot/send?access_token=用自己的'
MYSQL_PORT=3306
MYSQL_VIP1=主库
MYSQL_VIP2=从库
MYSQL_USERNAME=root
MYSQL_PASSWORD=用自己的
GET_MYSQL_PORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $5}'`
CHECK_MYSQL=`mysql -u$MYSQL_USERNAME -p$MYSQL_PASSWORD -h $MYSQL_VIP1 --connect_timeout=5 -e "show databases;"`
STATUS=$(mysql -u$MYSQL_USERNAME -p$MYSQL_PASSWORD -h $MYSQL_VIP1 -e "show slave status\G" | grep -i "running")
IO_env=`echo $STATUS | grep IO | awk ' {print $2}'`
SQL_env=`echo $STATUS | grep SQL | awk '{print $2}'`

function checkMysqlStatus(){
  if [ "$GET_MYSQL_PORT" == "3306" ]
  then
    if [ "$CHECK_MYSQL" -ne 0 ]
    then
      dingAlert "Server: $1 mysql is down, please try to restart mysql by manual!"
    else
      echo "Server: $1 mysql is running..."
    fi
  else
    dingAlert "WARN!Server: $1 mysql is down."
  fi

  if [ "$IO_env" = "Yes" -a "$SQL_env" = "Yes" ]
  then
    echo "Server: $1 MySQL Slave is running!"
  else
    dingAlert "Server: $1 MySQL Slave is not running!"
  fi
}

function dingAlert(){
  curl $DING_TOKEN \
    -H 'Content-Type: application/json' \
    -d "{"msgtype": "text", "text": {"content": "数据库监控测试(需要输入钉钉机器人关键字来调用)\n$1"}}"
}

checkMysqlStatus $MYSQL_VIP1

2.企业微信

SLAVE_IP:为监控的主机IP
USER:为msyql用户
PASSWORD:为mysql密码
WHEREIS_MYSQL:为mysql命令路径
WEBHOOK:为企业微信机器人Webhook地址
wx():为企业微信机器人函数
Check_Mysql_Slave():为监控脚本主函数

#! /bin/bash
#
source /etc/profile
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
SLAVE_IP=`ip add | grep inet | grep brd | awk -F / '{print $1}' | awk -F " " '{print $2}' | awk 'NR==1'`
USER=monitor
PASSWORD=xxxxxx
TIME=`date`
WHEREIS_MYSQL=/opt/mysql/bin/mysql
WEBHOOK='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=bb09197b-5ff6-4928-9872-xxxxxx'
wx(){
cat > $0.msg << EOF
curl '$WEBHOOK' \
   -H 'Content-Type: application/json' \
   -d '
   {
        "msgtype": "text",
        "text": {
            "content": "$1",
        }
   }'
EOF
sh $0.msg && rm -rf $0.msg
}
Check_Mysql_Slave()
{
    $WHEREIS_MYSQL -u$USER -p$PASSWORD -h$SLAVE_IP -e "select version();"  >/dev/null 2>&1
    if [  $? -ne 0 ];then
        echo "Mysql is stopped $DATE" >> /data/mysql/check.log
                ERROR="ERROR:Mysql-$SLAVE_IP cannot connect\n$TIME"
        wx "$ERROR"
    else
                IO_SQL_STATUS=`$WHEREIS_MYSQL -u$USER -p$PASSWORD -h$SLAVE_IP -e "show slave status \G" 2>/dev/null | awk '/Slave_.*_Running:/{print $1$2}'`
                for i in $IO_SQL_STATUS;do
                        THREAD_STATUS_NAME=${i%:*}
                        THREAD_STATUS=${i#*:}
                        if [ "$THREAD_STATUS" != "Yes" ];then
                                STATUS="ERROR:Mysql-$SLAVE_IP  $THREAD_STATUS_NAME status is $THREAD_STATUS!\n$TIME"
                echo "$STATUS" >> /data/mysql/check.log
                                wx "$STATUS"
                        fi
                done
   fi
}
Check_Mysql_Slave