#!/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}'`#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' ] ; thenecho "[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#删除临时状态文件rm -f $StatFileecho "[/chkslave]"fi
本脚本在 linux/freebsd 平台下均试验过。