MySQL复制 自动监控脚本

MySQL复制 自动监控脚本

#!/bin/sh
#
# created by yejr, 2007/06/03
#
# 本脚本用于监控MySQL 复制是否运行,并且根据具体的错误代码自动判断是否忽略
#

now=`date +"%Y%m%d%H%M%S"`

StatFile="./slave_status.$now"

echo "show slave status\G" | mysql -uroot -pmypasswd > $StatFile

#取得 io_thread, sql_thread, last_errno 的状态
IoStat=`cat $StatFile | grep Slave_IO_Running | awk '{print $2}'`
SqlStat=`cat $StatFile | grep Slave_SQL_Running | awk '{ print $2}'`
Errno=`cat $StatFile | grep Last_Errno | awk '{print $2}'`
Behind=`cat $StatFile | grep Seconds_Behind_Master | awk '{print $2}'`

#IoStat=`cat $StatFile | head -n 12 | tail -n 1 | awk '{print $2}'`
#SqlStat=`cat $StatFile | head -n 13 | tail -n 1 | awk '{print $2}'`
#Errno=`cat $StatFile | head -n 20 | tail -n 1 | awk '{print $2}'`


if [ $IoStat = 'No' ] || [ $SqlStat = 'No' ] ; then

echo "[chkslave]"
date
 #如果错误代码为 0,则可能是因为网络等原因导致复制中断,直接重新启动复制即可
 if [ "$Errno" -eq 0 ] ; then
  echo "start slave io_thread; start slave sql_thread;" | mysql -uroot -pmypasswd
  echo "start slave io_thread; start slave sql_thread;"
 #如果是一些不是很要紧的错误代码,也可以直接略过
 elif [ "$Errno" -eq 1007 ] || [ "$Errno" -eq 1053 ] || [ "$Errno" -eq 1062 ] || [ "$Errno" -eq 1213 ] \
|| [ "$Errno" -eq 1158 ] || [ "$Errno" -eq 1159 ] || [ "$Errno" -eq 1008 ] ; then
  echo "stop slave; set global sql_slave_skip_counter=1; slave start;" | mysql -uroot -pmypasswd
  echo "stop slave; set global sql_slave_skip_counter=1; slave start;"
 else
  echo `date` "slave is down!!!"
 fi

 # 远远落后于 master
 if [ $Behind -gt 200 ] ; then
   echo `date` "slave is behind master $Behind seconds!!!"
 fi

#删除临时状态文件
rm -f $StatFile

echo "[/chkslave]"

fi

本脚本在 linux/freebsd 平台下均试验过。

技术相关: 

评论

斑竹你这代码没有调试过吧,
我的slackware 11+mysql 5.1.18 beta里面运行后没有任何回应。只能ctrl+c停掉。
发现有这样的语句: mysql --uroot 无法在我这里运行。
root@st_server18:~# echo "start slave io_thread; start slave sql_thread;" | mysql --uroot
mysql: unknown option '--uroot'

Behind=`cat $SlaveStatFile | grep Seconds_Behind_Master | awk '{print $2}'`
这段应该是$StatFile 就能解决必需ctrl+c退出的问题了

Seconds_Behind_Master这个值有可能是NULL,

此时

if [ $Behind -gt 200 ] 会有问题。