1. 程式人生 > 實用技巧 >監控mysql主從同步狀態

監控mysql主從同步狀態

在高併發網站架構中,MySQL資料庫主從同步是不可或缺的,不過經常會發生由於網路原因或者操作錯誤,MySQL主從經常會出現不同步的情況,那麼如何監控MySQL主從同步,也變成網站正常執行的重要環節。

MySQL同步功能由3個執行緒(master上1個,slave上2個)來實現,簡單的說就是:master傳送日誌一個,slave接收日誌一個,slave執行日誌一個。

首先,我們解釋一下show slave status中重要的幾個引數:
Slave_IO_Running: I/O執行緒是否被啟動併成功地連線到主伺服器上。

Slave_SQL_Running: SQL執行緒是否被啟動。

Seconds_Behind_Master

:和主庫比同步延遲的秒數

本欄位是從屬伺服器“落後”多少的一個指示。當從屬SQL執行緒正在執行時(處理更新),本欄位為在主伺服器上由此執行緒執行的最近的一個事件的時間標記開始,已經過的秒數。當此執行緒被從屬伺服器I/O執行緒趕上,並進入閒置狀態,等待來自I/O執行緒的更多的事件時,本欄位為零。總之,本欄位測量從屬伺服器SQL執行緒和從屬伺服器I/O執行緒之間的時間差距,單位以秒計。

如何監控從伺服器是否正常執行呢?

[root@slave ~]# mysql -u root -proot -e "show slave status\G;"
*************************** 1
. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.31 #當前的mysql master伺服器主機 Master_User: myslave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master
-bin.000003 Read_Master_Log_Pos: 471 Relay_Log_File: relay-log-bin.000002 Relay_Log_Pos: 252 Relay_Master_Log_File: master-bin.000003 Slave_IO_Running: Yes #I/O執行緒是否被啟動併成功地連線到主伺服器上。 Slave_SQL_Running: Yes #SQL執行緒是否被啟動。 Master_SSL_Key: Seconds_Behind_Master: 0 #和主庫比同步延遲的秒數

下面編寫shell指令碼監控mysql主從同步,實現如下功能:

階段1:開發一個守護程序指令碼每30秒實現檢測一次。

階段2:如果同步出現如下錯誤號(1158,1159,1008,1007,1062),請跳過錯誤

階段3:請使用陣列技術實現上述指令碼(獲取主從判斷及錯誤號部分)

#!/bin/bash
mysql_cmd="mysql -u root -proot"
errornum=(1158 1159 1008 1007 1062)
while true
do
  array=($($mysql_cmd -e "show slave status\G"|egrep ‘_Running|Behind_Master|Last_SQL_Errno‘|awk ‘{print $NF}‘))
  if [ "${array[0]}" == "Yes" -a "${array[1]}" == "Yes" -a "${array[2]}" == "0" ]
  then
    echo "MySQL is slave is running"
  else
      for ((i=0;i<${#errornum[*]};i++))
      do
        if [ "${array[3]}" = "${errornum[$i]}" ];then
        $mysql_cmd -e "stop slave &&set global sql_slave_skip_counter=1;start slave;"
        fi
      done
      char="MySQL slave is downed"
      echo "$char"
      echo "$char"|mail -s "$char" [email protected]
      break
  fi
  sleep 30
done

示例一:
cat check_mysql_health

#!/bin/sh
slave_is=($(mysql -S /tmp/mysql3307.sock -uroot -e "show slave status\G"|grep "Slave_.*_Running" |awk '{print $2}')) 
if [ "${slave_is[0]}" = "Yes" -a "${slave_is[1]}" = "Yes" ]
     then
     echo "OK SDK-slave3307 connect master3306 is running"
     exit 0
else
     echo "Critical SDK-slave3307 connect master3306 is not running"
     exit 2
fi 


示例二:
[root@slavedb test]# cat Check_Mysql_Synchronization.sh #!/bin/bash MYUSER=root MYSOCKET=/tmp/mysql3306.sock MYPASSWD= MYLOGIN="mysql -S $MYSOCKET -u$MYUSER " ERROR=(1158 1159 1008 1007 1062 1050) check_status(){ STATUS=($($MYLOGIN -e "show slave status\G"|egrep "Slave_SQL_Running|Slave_IO_Running|Seconds_Behind_Master|Last_SQL_Errno"|awk '{print $NF}')) if [ "${STATUS[0]}" = "Yes" -a "${STATUS[1]}" = "Yes" -a "${STATUS[2]} = 0" ];then echo "Mysql Slave is Ok!" CHECK_NUM=0 return $CHECK_NUM else CHECK_NUM=1 return $CHECK_NUM fi } check_error(){ check_status if [ $? -eq 1 ];then for ((i=0;i<${#ERROR[*]};i++));do if [ "${ERROR[i]}" == "${STATUS[3]}" ];then $MYLOGIN -e "stop slave;" $MYLOGIN -e "set global sql_slave_skip_counter=1" $MYLOGIN -e "start slave;" fi done fi } check_again(){ STATUS=($($MYLOGIN -e "show slave status\G"|egrep "Slave_SQL_Running|Slave_IO_Running|Seconds_Behind_Master|Last_SQL_Errno"|awk '{print $NF}')) check_status >/dev/null 2&>1 if [ $? -eq 1 ];then echo "Mysql slave is fail $(date +%F)" fi } main(){ while true;do check_error check_again sleep 10 done } main