代碼如下:
- #!/bin/bash
- #check MySQL_Slave Status
- #crontab time 00:10
- MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $4}'`
- MYSQLIP=`ifconfig eth0|grep "inet addr" | awk -F[:" "]+ '{print $4}'`
- STATUS=$(/usr/local/webserver/mysql/bin/mysql -u yuhongchun -pyuhongchun101 -S /tmp/mysql.sock -e "show slave status\G" | grep -i "running")
- IO_env=`echo $STATUS | grep IO | awk ' {print $2}'`
- SQL_env=`echo $STATUS | grep SQL | awk '{print $2}'`
- DATA=`date +"%y-%m-%d %H:%M:%S"`
-
- if [ "$MYSQLPORT" == "3306" ]
- then
- echo "mysql is running"
- else
- mail -s "warn!server: $MYSQLIP mysql is down" yuhongchun027@163.com
- fi
-
- if [ "$IO_env" = "Yes" -a "$SQL_env" = "Yes" ]
- then
- echo "Slave is running!"
- else
- echo "####### $DATA #########">> /data/data/check_mysql_slave.log
- echo "Slave is not running!" >> /data/data/check_mysql_slave.log
- echo "Slave is not running!" | mail -s "warn! $MYSQLIP MySQL Slave is not running" yuhongchun027@163.com
- fi
建議每十分鐘運行一次
*/10 * * * * root /bin/sh /root/mysql_slave.sh
記得在每台MySQL從機上分配一個yuhongchun的使用者,許可權大些也沒關係,只限定在本地運行,如下所示:
- grant all privileges on *.* to "yuhongchun"@"127.0.0.1" identified by "yuhongchun101";
- grant all privileges on *.* to "yuhongchun"@"localhost" identified by "yuhongchun101";
指令碼設計思路:
1、此指令碼應該能適應各種各樣不同的內外網環境,即IP不同的環境;
2、讓指令碼也順便監控下MySQL是否正常運行;
3、Slave機器的IO和SQL狀態都必須為YES,缺一不可,這裡用到了多重條件判斷-a。
指令碼產生的背景環境:
我有不少基於公網類型的網站(沒有硬體防火牆,直接置於IDC機房)做的都是MySQL主從架構,從機主要起備份資料庫和冷備份的作用,雖然從機宕機了問題不大,但也影響資料的備份工作;這樣的網站有數十個,如果一個一個手動的檢查,每天都要浪費不少時間,所以玩了下指令碼控,設計了如上指令碼。
指令碼實踐:
此指令碼我已用於了生產環境,大家可以放在我們的從MySQL機器上,用來監控;另外建議有時也手動檢查下,有次發現rsync --delete 自動刪除了/data/data裡面的資料,即從資料庫的位置,指令碼沒有警示。
後期應用:
後期公司的MySQL資料庫準備由一主一從架色升級成一主多從,讀寫分離的架構,LVS作從資料庫的負載平衡器,此指令碼自動監控從MySQL的replication狀態,如果不能同步則自動關閉原生MySQL服務,免得影響整個網站的正常業務訪問。當然了,到時指令碼的運行周期肯定也需要更改,由10分鐘變成秒級的,這個可以通過while迴圈來實現。
本文出自 “撫琴煮酒” 部落格,請務必保留此出處http://andrewyu.blog.51cto.com/1604432/666019