zoukankan      html  css  js  c++  java
  • 用shell脚本监控MySQL主从同步

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

     1 [root@mysql01 shell]# mysql -uroot -poldboy123 -S /data/3307/mysql.sock -e "show slave statusG"
     2 Warning: Using a password on the command line interface can be insecure.
     3 *************************** 1. row ***************************
     4                Slave_IO_State: Waiting for master to send event
     5                   Master_Host: 172.16.1.52
     6                   Master_User: rep
     7                   Master_Port: 3306
     8                 Connect_Retry: 60
     9               Master_Log_File: mysql-bin.000002
    10           Read_Master_Log_Pos: 120
    11                Relay_Log_File: relay-bin.000002
    12                 Relay_Log_Pos: 283
    13         Relay_Master_Log_File: mysql-bin.000002
    14              Slave_IO_Running: Yes
    15             Slave_SQL_Running: Yes
    16               Replicate_Do_DB: 
    17           Replicate_Ignore_DB: 
    18            Replicate_Do_Table: 
    19        Replicate_Ignore_Table: 
    20       Replicate_Wild_Do_Table: 
    21   Replicate_Wild_Ignore_Table: 
    22                    Last_Errno: 0
    23                    Last_Error: 
    24                  Skip_Counter: 0
    25           Exec_Master_Log_Pos: 120
    26               Relay_Log_Space: 450
    27               Until_Condition: None
    28                Until_Log_File: 
    29                 Until_Log_Pos: 0
    30            Master_SSL_Allowed: No
    31            Master_SSL_CA_File: 
    32            Master_SSL_CA_Path: 
    33               Master_SSL_Cert: 
    34             Master_SSL_Cipher: 
    35                Master_SSL_Key: 
    36         Seconds_Behind_Master: 0
    37 Master_SSL_Verify_Server_Cert: No
    38                 Last_IO_Errno: 0
    39                 Last_IO_Error: 
    40                Last_SQL_Errno: 0
    41                Last_SQL_Error: 
    42   Replicate_Ignore_Server_Ids: 
    43              Master_Server_Id: 12
    44                   Master_UUID: 74e721f9-3c82-11e8-a818-000c29a97a9f
    45              Master_Info_File: /data/3307/data/master.info
    46                     SQL_Delay: 0
    47           SQL_Remaining_Delay: NULL
    48       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
    49            Master_Retry_Count: 86400
    50                   Master_Bind: 
    51       Last_IO_Error_Timestamp: 
    52      Last_SQL_Error_Timestamp: 
    53                Master_SSL_Crl: 
    54            Master_SSL_Crlpath: 
    55            Retrieved_Gtid_Set: 
    56             Executed_Gtid_Set: 
    57                 Auto_Position: 0

    1、编写shell脚本:

    系统:centos6.7

    Mysql:多实例主从同步

    #!/bin/bash
    
    #-------------CopyRight-------------  
    #   Name:MySQL Check master and slave  
    #   Version Number:1.00  
    #   Type:sh  
    #   Language:bash shell  
    #   Date:2018-05-09  
    #   Author:xubing 
    #   QQ:442656067
    #   Email:eeexu123@163.com  
    #   Blog:https://www.cnblogs.com/eeexu123/
    
    
    Port=3307                                         //MySQL端口
    User="root"                                       //MySQL用户
    Password="oldboy123"                              //MySQL用户密码
    Mysql_sock="/data/${Port}/mysql.sock"             //mysql.sock随着每次MySQL启动而生成
    Mysql_cmd="/application/mysql/bin/mysql -u${User} -p${Password} -S $Mysql_sock -e"  //MySQL非交互命令
    Error_file="/tmp/mysql_check_error.log"   //错误输入文件
    
    #source functions libary
    . /etc/init.d/functions
    
    #check mysql server    //检查MySQL是否启动
    [ -e $Mysql_sock ]||{
      echo "The Mysql server no start"
      exit 1
    }
    
    #function ingore errors    //忽略错误函数
    skip_errors(){
      array=(1158 1159 1008 1007 1062)
      flag=0
      for num in ${array[*]}
      do
        if [ "$1" = "$num" ];then    //如果有对应的错误号,MySQL就跳过此错误号
           ${Mysql_cmd} "stop slave;set global sql_slave_skip_counter = 1;start slave;"  
           echo "Last_IO_Errno:$1">>$Error_file
        else
           echo "Last_IO_Errno:$1">>$Error_file
           ((flag++))   //如果此错误号不在array数组中,将此错误号写入错误文件中,并循环五次
        fi
      done
    
      if [ $flag = ${#array[@]} ];then   //发送邮件
         echo "**********`date +%F_%T`************">>$Error_file
         uniq $Error_file|mail -s "Mysql Slave error" eeexu123@163.com 
      fi
    }
    
    #check mysql slave  //检查从库是否正常
    check_mysql(){
      array1=(`${Mysql_cmd} "show slave statusG"|egrep "Slave_IO_Running|Slave_SQL_Running|Last_SQL_Errno|Seconds_Behind_Master"|awk '{print $NF}'`)
      if [ "${array1[0]}" = "Yes" -a "${array1[1]}" == "Yes" -a "${array1[2]}" = 0 ];then
         action "Mysql Slave" /bin/true
      else
         action "Mysql Slave" /bin/false
         if [ "${array1[0]}" != "Yes" ];then   //将上述错误的列写入到错误文件中
            ${Mysql_cmd} "show slave statusG"|grep "Slave_IO_Running">>$Error_file
         elif [ "${array1[1]}" != "Yes" ];then
            ${Mysql_cmd} "show slave statusG"|grep "Slave_SQL_Running"|grep -v "Slave_SQL_Running_State">>$Error_file
         else [ "${array1[2]}" != 0 ]
            ${Mysql_cmd} "show slave statusG"|grep "Seconds_Behind_Master">>$Error_file
         fi
         skip_errors ${array1[3]}  //发送邮件
      fi
    }
    
    main(){
      while true
      do
        check_mysql
        sleep 60
      done
    }
    main

    2、检测(执行脚本)

    a:检测忽略号

    先在从库3307中创建库

    mysql>  create database taili123;
    Query OK, 1 row affected (0.00 sec)

    再在主库3306中创建库

    mysql>  create database taili123;
    Query OK, 1 row affected (0.00 sec)

    再次查看从库状态如下:出现错误代码

     1 mysql> show slave statusG
     2 *************************** 1. row ***************************
     3                Slave_IO_State: Waiting for master to send event
     4                   Master_Host: 172.16.1.52
     5                   Master_User: rep
     6                   Master_Port: 3306
     7                 Connect_Retry: 60
     8               Master_Log_File: mysql-bin.000002
     9           Read_Master_Log_Pos: 977
    10                Relay_Log_File: relay-bin.000009
    11                 Relay_Log_Pos: 370
    12         Relay_Master_Log_File: mysql-bin.000002
    13              Slave_IO_Running: Yes
    14             Slave_SQL_Running: No
    15               Replicate_Do_DB: 
    16           Replicate_Ignore_DB: 
    17            Replicate_Do_Table: 
    18        Replicate_Ignore_Table: 
    19       Replicate_Wild_Do_Table: 
    20   Replicate_Wild_Ignore_Table: 
    21                    Last_Errno: 1007
    22                    Last_Error: Error 'Can't create database 'taili123'; database exists' on query. Default database: 'taili123'. Query: 'create database taili123'
    23                  Skip_Counter: 0
    24           Exec_Master_Log_Pos: 871
    25               Relay_Log_Space: 1233
    26               Until_Condition: None
    27                Until_Log_File: 
    28                 Until_Log_Pos: 0
    29            Master_SSL_Allowed: No
    30            Master_SSL_CA_File: 
    31            Master_SSL_CA_Path: 
    32               Master_SSL_Cert: 
    33             Master_SSL_Cipher: 
    34                Master_SSL_Key: 
    35         Seconds_Behind_Master: NULL
    36 Master_SSL_Verify_Server_Cert: No
    37                 Last_IO_Errno: 0
    38                 Last_IO_Error: 
    39                Last_SQL_Errno: 1007
    40                Last_SQL_Error: Error 'Can't create database 'taili123'; database exists' on query. Default database: 'taili123'. Query: 'create database taili123'
    41   Replicate_Ignore_Server_Ids: 
    42              Master_Server_Id: 12
    43                   Master_UUID: 74e721f9-3c82-11e8-a818-000c29a97a9f
    44              Master_Info_File: /data/3307/data/master.info
    45                     SQL_Delay: 0
    46           SQL_Remaining_Delay: NULL
    47       Slave_SQL_Running_State: 
    48            Master_Retry_Count: 86400
    49                   Master_Bind: 
    50       Last_IO_Error_Timestamp: 
    51      Last_SQL_Error_Timestamp: 180516 08:43:37
    52                Master_SSL_Crl: 
    53            Master_SSL_Crlpath: 
    54            Retrieved_Gtid_Set: 
    55             Executed_Gtid_Set: 
    56                 Auto_Position: 0

    查看脚本执行状态:

     1 [root@mysql01 shell]# sh ckmysql_master_slave.sh                       
     2 Warning: Using a password on the command line interface can be insecure.
     3 Mysql Slave                                                [失败]
     4 Warning: Using a password on the command line interface can be insecure.
     5 Warning: Using a password on the command line interface can be insecure.
     6 Warning: Using a password on the command line interface can be insecure.
     7 Mysql Slave                                                [失败]
     8 Warning: Using a password on the command line interface can be insecure.
     9 Warning: Using a password on the command line interface can be insecure.
    10 Warning: Using a password on the command line interface can be insecure.
    11 Mysql Slave                                                [确定]

    b:检测发送邮件

    在从库中停止SQL线程

    mysql> stop slave sql_thread; 
    Query OK, 0 rows affected (0.02 sec)

    再次查看从库状态

     1 mysql> show slave statusG
     2 *************************** 1. row ***************************
     3                Slave_IO_State: Waiting for master to send event
     4                   Master_Host: 172.16.1.52
     5                   Master_User: rep
     6                   Master_Port: 3306
     7                 Connect_Retry: 60
     8               Master_Log_File: mysql-bin.000002
     9           Read_Master_Log_Pos: 977
    10                Relay_Log_File: relay-bin.000011
    11                 Relay_Log_Pos: 283
    12         Relay_Master_Log_File: mysql-bin.000002
    13              Slave_IO_Running: Yes
    14             Slave_SQL_Running: No
    15               Replicate_Do_DB: 
    16           Replicate_Ignore_DB: 
    17            Replicate_Do_Table: 
    18        Replicate_Ignore_Table: 
    19       Replicate_Wild_Do_Table: 
    20   Replicate_Wild_Ignore_Table: 
    21                    Last_Errno: 0
    22                    Last_Error: 
    23                  Skip_Counter: 0
    24           Exec_Master_Log_Pos: 977
    25               Relay_Log_Space: 613
    26               Until_Condition: None
    27                Until_Log_File: 
    28                 Until_Log_Pos: 0
    29            Master_SSL_Allowed: No
    30            Master_SSL_CA_File: 
    31            Master_SSL_CA_Path: 
    32               Master_SSL_Cert: 
    33             Master_SSL_Cipher: 
    34                Master_SSL_Key: 
    35         Seconds_Behind_Master: NULL
    36 Master_SSL_Verify_Server_Cert: No
    37                 Last_IO_Errno: 0
    38                 Last_IO_Error: 
    39                Last_SQL_Errno: 0
    40                Last_SQL_Error: 
    41   Replicate_Ignore_Server_Ids: 
    42              Master_Server_Id: 12
    43                   Master_UUID: 74e721f9-3c82-11e8-a818-000c29a97a9f
    44              Master_Info_File: /data/3307/data/master.info
    45                     SQL_Delay: 0
    46           SQL_Remaining_Delay: NULL
    47       Slave_SQL_Running_State: 
    48            Master_Retry_Count: 86400
    49                   Master_Bind: 
    50       Last_IO_Error_Timestamp: 
    51      Last_SQL_Error_Timestamp: 
    52                Master_SSL_Crl: 
    53            Master_SSL_Crlpath: 
    54            Retrieved_Gtid_Set: 
    55             Executed_Gtid_Set: 
    56                 Auto_Position: 0

    查看邮件收发,接收如下状态:

  • 相关阅读:
    bootstrap treevie只展开一个节点,关闭其他节点
    Java后端校验-使用hibernate-validator校验JavaBean
    js生成Excel文件
    Databus&canal对比
    KVM安装配置笔记
    机器学习之数学基础一导数
    机器学习-线性回归
    机器学习之数学基础一统计
    Leader与Boss,技术leader与管理者
    php递归获取无限分类菜单
  • 原文地址:https://www.cnblogs.com/eeexu123/p/9044265.html
Copyright © 2011-2022 走看看