mysqlプライマリスレーブのレプリケーションステータスを自動的に判断し、メール通知



MYSQLの主従データの一貫性を定期的に検証することは、時には価値のあることであり、googleはMYSQLパッチを提供して自動的にこの機能を実現します.しかし、レプリケーションのステータスを定期的にチェックできる場合もあります.現在、mysqlのプライマリ・セカンダリ・レプリケーションのステータスをオンラインで自動的にチェックする方法は少ないので、スクリプトを作成しました.このスクリプトは機能を実現します.
1.mysqlコマンドにより、mysqlがサーバから3つの主要コピー状態値が正常か否かを判断し、問題が検出された後、設定時間間隔値に基づいて2回繰り返し検出し、そのうちSeconds_Behind_Master値はレプリケーション遅延を正確に記述できないため,3600秒以下で正常と判断した.
2.問題が検出されたらログを記録し、メール通知ステータス値の内容を送信し、問題が継続している場合は設定時間間隔値に従ってメール通知を再送信し、正常に戻ってもメール通知を送信します.また、正常かどうかにかかわらず、毎日1回メール通知を送信し、計画タスクと時間に関する変数値によって決定します.
このスクリプトは、プライマリ・スレーブのレプリケーション・ステータスを監視し、プライマリ・スレーブのMYSQLデータの一貫性を検証する場合は、googleが提供するMYSQLパッチを検討します.
#/bin/bash 
############################################# 
# author zhaoyanan 
# date 2013/01/25   create 
# update 2013/01/28  Adding duplicate detection 
# 
# Execution: 
# touch /root/sh/mysql_slave_status.sh; chmod 700 /root/sh/mysql_slave_status.sh 
# vi /etc/crontab 
# 5,15,25,35,45,55 * * * * root /root/sh/mysql_slave_status.sh >> /root/sh/mysql_slave_status.log 2>&1 
############################################# 
 
######### set variables ############ 
tmpdir=/tmp 
 
#mysqlhost="127.0.0.1" 
#mysqlport="3306" 
mysqlsocket="/opt/mysql/var/mysql.sock" 
mysqlbinpath="/opt/mysql/bin" 
mysqluser="root" 
mysqlpw="pass" 
 
servername="dbname" 
mailfromadd='dbname<[email protected]' 
mailtoadd='user1<[email protected]>' 
#mailccadd='user2<[email protected]>' 
repeat_alarm_time=12           # Repeat alarm time interval ( About *10 minute. value of 12, about two hours) 
failure_interval=10            # Interval after a problem is detected, the unit: seconds ( < 25 seconds) 
reporting_time=0855            # Must be notified of the time, even if normal. 
current_time=$(date +%H%M)     # Current time 
 
export LANG=C 
export LC_ALL=C 
export PATH="$mysqlbinpath":/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
 
 
###### do #################################### 
echo "" 
echo "" 
echo "`date` Start monitoring." 
 
 
#### function #### 
function mailto() { 
# mail 
/usr/sbin/sendmail -t <<EOF 
From: $mailfromadd 
To: $mailtoadd 
Cc: $mailccadd 
Subject: $servername slave status ok! 
---------------------------------- 
$servername slave status:  
$slaveiostatus 
$slavesqlstatus 
$slavebehind 
---------------------------------- 
EOF 
} 
 
function mailto2() { 
# mail 
/usr/sbin/sendmail -t <<EOF 
From: $mailfromadd 
To: $mailtoadd 
Cc: $mailccadd 
Subject: $servername slave status problems! 
---------------------------------- 
$servername slave status:  
$slaveiostatus 
$lastioerror 
$slavesqlstatus 
$lastsqlerror 
$slavebehind 
---------------------------------- 
EOF 
} 
 
function mailto3() { 
# mail 
/usr/sbin/sendmail -t <<EOF 
From: $mailfromadd 
To: $mailtoadd 
Cc: $mailccadd 
Subject: $servername slave status problems! (too many times) 
---------------------------------- 
$servername slave status:  
$slaveiostatus 
$lastioerror 
$slavesqlstatus 
$lastsqlerror 
$slavebehind 
---------------------------------- 
EOF 
} 
 
function mailto4() { 
# mail 
/usr/sbin/sendmail -t <<EOF 
From: $mailfromadd 
To: $mailtoadd 
Cc: $mailccadd 
Subject: $servername slave status return to normal from the question. 
---------------------------------- 
$servername slave status:  
$slaveiostatus 
$slavesqlstatus 
$slavebehind 
---------------------------------- 
EOF 
} 
 
function showstatus() { 
mysql -S $mysqlsocket -u"$mysqluser" -p"$mysqlpw" -e "show slave status\G" > "$tmpdir"/"$servername"_status.txt 
slaveiostatus=`cat "$tmpdir"/"$servername"_status.txt | grep "Slave_IO_Running" | sed 's/^[ \t]*//g'` 
lastioerror=`cat "$tmpdir"/"$servername"_status.txt | grep "Last_IO_Error" | sed 's/^[ \t]*//g'` 
slavesqlstatus=`cat "$tmpdir"/"$servername"_status.txt | grep "Slave_SQL_Running" | sed 's/^[ \t]*//g'` 
lastsqlerror=`cat "$tmpdir"/"$servername"_status.txt | grep "Last_SQL_Error" | sed 's/^[ \t]*//g'` 
slavebehind=`cat "$tmpdir"/"$servername"_status.txt | grep "Seconds_Behind_Master" | sed 's/^[ \t]*//g'` 
slaveiovalue=`cat "$tmpdir"/"$servername"_status.txt | grep "Slave_IO_Running" | sed 's/^[ \t]*//g' | awk -F ': ' '{print $2}'` 
slavesqlvalue=`cat "$tmpdir"/"$servername"_status.txt | grep "Slave_SQL_Running" | sed 's/^[ \t]*//g' | awk -F ': ' '{print $2}'` 
slavebehindvalue=`echo "$slavebehind" | awk -F ': ' '{print $2}' | grep '[0-9]'` 
} 
 
 
### check #### 
test -f "$tmpdir"/"$servername"_m_value || echo "0" > "$tmpdir"/"$servername"_m_value 
test -f "$tmpdir"/"$servername"_n_value || echo "0" > "$tmpdir"/"$servername"_n_value 
m=`cat "$tmpdir"/"$servername"_m_value` 
n=`cat "$tmpdir"/"$servername"_n_value` 
 
if   showstatus;sync;sleep 1 
     [ "$slaveiovalue" == "Yes" ] && [ "$slavesqlvalue" == "Yes" ] && [ "$slavebehindvalue" -le 3600 ];then 
     echo "`date` First detected, $servername slave status ok!" 
     m=0; echo $m > "$tmpdir"/"$servername"_m_value 
elif sleep $failure_interval 
     showstatus;sync;sleep 1 
     [ "$slaveiovalue" == "Yes" ] && [ "$slavesqlvalue" == "Yes" ] && [ "$slavebehindvalue" -le 3600 ];then 
     echo "`date` Second detection, $servername slave status ok!" 
     m=0; echo $m > "$tmpdir"/"$servername"_m_value 
elif sleep $failure_interval 
     showstatus;sync;sleep 1 
     [ "$slaveiovalue" == "Yes" ] && [ "$slavesqlvalue" == "Yes" ] && [ "$slavebehindvalue" -le 3600 ];then 
     echo "`date` Third detection, $servername slave status ok!" 
     m=0; echo $m > "$tmpdir"/"$servername"_m_value 
else 
     echo "`date` After three detection, $servername slave problems!" 
     m=$(($m+1)); echo $m > "$tmpdir"/"$servername"_m_value 
fi 
 
 
#### log and mail #### 
if   [ "$reporting_time" -eq "$current_time" ] && [ "$m" -eq 0 ] && [ "$n" -eq 0 ]; then 
     echo "mailto." 
     mailto 
elif [ "$m" -eq 1 ] && [ "$n" -eq 0 ]; then 
     echo "`date` $servername slave status problems! mailto2." 
     echo "$servername slave status: " 
     echo "$slaveiostatus" 
     echo "$lastioerror" 
     echo "$slavesqlstatus" 
     echo "$lastsqlerror" 
     echo "$slavebehind" 
     mailto2 
     n=1; echo $n > "$tmpdir"/"$servername"_n_value 
elif [ "$m" -eq "$repeat_alarm_time" ] && [ "$n" -eq 1 ]; then 
     mailto3 
     echo "`date` $servername slave status problems! too many times, mailto3." 
     m=0; echo $m > "$tmpdir"/"$servername"_m_value 
elif [ "$m" -eq 0 ] && [ "$n" -eq 1 ]; then 
     mailto4 
     echo "$servername slave status return to normal from the question. mailto4." 
     n=0; echo $n > "$tmpdir"/"$servername"_n_value 
elif [ "$m" -ne 0 ] && [ "$n" -eq 1 ]; then 
     echo "`date` $servername slave status problems! too many times, nomailto" 
fi

原文:http://www.zhaoyanan.cn/mysql-slave-status-check.html
本文は「調兵虎符」ブログから、転載をお断りします!