歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> linux shell mysql 數據庫主從同步狀態檢查告警

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

日期:2017/3/1 12:19:50   编辑:SHELL編程
需求: 1、監測數據庫主從狀態 2、獲取數據庫主要參數 3、可讀取配置文件 4、部署位置自適應。 #全局變量包括程序路徑,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的狀態,如果每次循環都去判斷發短信的話會造成 兩個問題: 1、如果多個DB出現問題,會瞬間發出多條短信,而短信平台會屏蔽短時間內連續向一個號碼發送短信的行為。 2、浪費,不能因為更容易寫就浪費短信。 當然,這個腳本還是一個比較弱爆的功能,我繼續努力。
Copyright © Linux教程網 All Rights Reserved