代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#!/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
|
建议每十分钟运行一次
1
|
*
/10
* * * * root
/bin/sh
/root/mysql_slave
.sh
|
记得在每台MySQL从机上分配一个yuhongchun的用户,权限大些也没关系,只限定在本地运行,如下所示:
1
2
|
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循环来实现。
本文转自 抚琴煮酒 51CTO博客,原文链接:http://blog.51cto.com/yuhongchun/666019,如需转载请自行联系原作者