代码如下:
- #!/bin/bash
- #checkMySQL_SlaveStatus
- #crontabtime00:10
- MYSQLPORT=`netstat-na|grep"LISTEN"|grep"3306"|awk-F[:""]+'{print$4}'`
- MYSQLIP=`ifconfigeth0|grep"inetaddr"|awk-F[:""]+'{print$4}'`
- STATUS=$(/usr/local/webserver/mysql/bin/mysql-uyuhongchun-pyuhongchun101-S/tmp/mysql.sock-e"showslavestatus\G"|grep-i"running")
- IO_env=`echo$STATUS|grepIO|awk'{print$2}'`
- SQL_env=`echo$STATUS|grepSQL|awk'{print$2}'`
- DATA=`date+"%y-%m-%d%H:%M:%S"`
- if["$MYSQLPORT"=="3306"]
- then
- echo"mysqlisrunning"
- else
- mail-s"warn!server:$MYSQLIPmysqlisdown"yuhongchun027@163.com
- fi
- if["$IO_env"="Yes"-a"$SQL_env"="Yes"]
- then
- echo"Slaveisrunning!"
- else
- echo"#######$DATA#########">>/data/data/check_mysql_slave.log
- echo"Slaveisnotrunning!">>/data/data/check_mysql_slave.log
- echo"Slaveisnotrunning!"|mail-s"warn!$MYSQLIPMySQLSlaveisnotrunning"yuhongchun027@163.com
- fi
建议每十分钟运行一次
*/10 * * * * root /bin/sh /root/mysql_slave.sh
记得在每台MySQL从机上分配一个yuhongchun的用户,权限大些也没关系,只限定在本地运行,如下所示:
- grantallprivilegeson*.*to"yuhongchun"@"127.0.0.1"identifiedby"yuhongchun101";
- grantallprivilegeson*.*to"yuhongchun"@"localhost"identifiedby"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