linux shell mysql 數據庫主從同步狀態檢查告警

需求:
一、監測數據庫主從狀態
二、獲取數據庫主要參數
三、可讀取配置文件
四、部署位置自適應。
 
參考資料:
http://blog.csdn.net/yf210yf/article/details/9207147
http://blog.csdn.net/lllxy/article/details/3423580
http://www.jb51.net/article/53022.htm
http://www.2cto.com/os/201307/225515.html
 
#全局變量包括程序路徑,bin文件路徑,時間,發送短信數據庫配置
#!/bin/bash
#獲取shell腳本執行路徑
DIR="$( cd "$( dirname "$0"  )" && pwd  )"
BINPATH=`echo $DIR | sed -e 's/\/bin//'`
TIME=`date "+%Y-%m-%d %H:%M:%S"`
#數據庫鏈接,用於短信發送
SQLPARAM_SMS="mysql -uXXXX -pXXXX -h192.168.1.1"
 
#讀取配置文件,並獲取同步狀態
#配置文件的內容和格式能夠看我上一篇博文,另外直接看命令也能夠分析出來
while read LINE
do
CHOST=`echo $LINE | awk -F ':' '{print $2}'`
DBNAME=`echo $LINE | awk -F ':' '{print $1}'`
SQLPARAM="mysql -h$CHOST -uroot -pdascom"
#獲取從庫同步狀態,並輸出至臨時文件,固然也能夠直接處理
$SQLPARAM < $DIR/status.sql > $DIR/temp.log
REIO=`grep Slave_IO_Running $DIR/temp.log | awk -F ': ' '{print $2}'`
RESQL=`grep Slave_SQL_Running $DIR/temp.log | awk -F ': ' '{print $2}'`
#判斷同步狀態,並將結果輸出至臨時文件
#if判斷,沒啥好說的,具體的使用方法能夠看我全面發出的參考資料連接
if [ "$REIO"x = "Yes"x -a "$RESQL"x = "Yes"x ];then
echo $TIME " ""Check '$DBNAME' is OK." >> $BINPATH/log/check.log
echo -e "0\c" >> $DIR/status.txt
else
echo $TIME " ""Check '$DBNAME' is down." >> $BINPATH/log/check.log
echo -e "$DBNAME \c" >> $DIR/status.txt
fi
done<$BINPATH/etc/chslave.conf
 
#對結果進行分析,若有異常發出短信告警
if grep -q "DB" $DIR/status.txt
then
sed -i "s/0//g" $DIR/status.txt
ERRDB=`sed -n 1p $DIR/status.txt`
echo "
set names 'gbk';
insert into ultrax.msgsend (service, srcNo, destNo,  msgcontent) values ('30', '10000', '18612255693', '$ERRDB mysql_slave is down.');
" > $DIR/temp.sql
$SQLPARAM_SMS < $BINPATH/bin/temp.sql
else
echo $TIME " All DB is ok!" >> $BINPATH/log/check.log
fi
 
#刪除臨時文件
rm -rf $DIR/status.txt $DIR/temp.log $DIR/status.txt $DIR/temp.sql
 
PS:這裏解釋個至關弱爆,可是也是些微的書寫思路的問題。
    之因此,發送告警短信的if循環是在while循環外面,是由於考慮到:我須要檢查多個DB的狀態,若是每次循環都去判斷髮短信的話會形成
兩個問題:
     一、若是多個DB出現問題,會瞬間發出多條短信,而短信平臺會屏蔽短期內連續向一個號碼發送短信的行爲。
     二、浪費,不能由於更容易寫就浪費短信。
 
固然,這個腳本仍是一個比較弱爆的功能,我繼續努力。
相關文章
相關標籤/搜索