需求:
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、浪費,不能因為更容易寫就浪費短信。
當然,這個腳本還是一個比較弱爆的功能,我繼續努力。