在高並發網站架構中,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" xxxxx@qq.com
break
fi
sleep 30
done
