CentOS下编写shell脚本来监控MySQL主从复制的教程
目的:定时监控MySQL主从数据库是否同步,如果不同步,记录故障时间,并执行命令使主从恢复同步状态
1、创建脚本文件
vi/home/crontab/check_mysql_slave.sh#编辑,添加下面代码
#!/bin/sh
#check_mysql_slavestatus
ip=eth0#网卡名称
mysql_binfile=/usr/local/mysql/bin/mysql
mysql_user=root#MySQL数据库账号
mysql_pass=123456#密码
mysql_sockfile=/tmp/mysql.sock
datetime=`date+"%Y-%m-%d/%H:%M:%S"`#获取当前时间
mysql_slave_logfile=/home/logs/check_mysql_slave.log#日志文件路径,必须提前创建好
slave_ip=`ifconfig$ip|grep"inetaddr"|awk-F[:""]+'{print$4}'`
status=$($mysql_binfile-u$mysql_user-p$mysql_pass-S$mysql_sockfile-e"showslavestatus\G"|grep-i"running")
Slave_IO_Running=`echo$status|grepSlave_IO_Running|awk'{print$2}'`
Slave_SQL_Running=`echo$status|grepSlave_SQL_Running|awk'{print$2}'`
if["$Slave_IO_Running"="Yes"-a"$Slave_SQL_Running"="Yes"]
thenecho"SlaveisRunning!"
else
echo"$datetime$slave_ipSlaveisnotrunning!">>$mysql_slave_logfile
$mysql_binfile-u$mysql_user-p$mysql_pass-S$mysql_sockfile-e"SLAVESTOP;"
$mysql_binfile-u$mysql_user-p$mysql_pass-S$mysql_sockfile-e"SETGLOBALSQL_SLAVE_SKIP_COUNTER=1;"
$mysql_binfile-u$mysql_user-p$mysql_pass-S$mysql_sockfile-e"SLAVESTART;"
$mysql_binfile-u$mysql_user-p$mysql_pass-S$mysql_sockfile-e"EXIT"
fi
:wq!#保存退出 chmod+x/home/crontab/check_mysql_slave.sh#添加脚本执行权限
2、添加任务计划,修改/etc/crontab
vi/etc/crontab#在最后一行添加 */10****root/home/crontab/check_mysql_slave.sh#表示每10分钟执行一次 :wq!#保存退出
3、重新启动crond使设置生效
/etc/rc.d/init.d/crondrestart#yuminstall-yvixie-cron安装计划任务,某些系统上可能没有预装 chkconfigcrondon#设为开机启动 servicecrondstart#启动
可以根据日志文件/home/logs/check_mysql_slave.log查看MySQL主从同步状态
PS:接下来这个脚本增加了“当发现同步出现无法同步的时候”会自动提取主库的file号,以及pos,进行同步主库,脚本内容如下:
#!/bin/sh
#set-x
#fileisslave_repl.sh
#AuthorbyKevin
#dateis2011-11-13
mstool="/usr/local/mysql-3307/bin/mysql-h192.168.1.106-uroot-pw!zl7POg27-P3307"
sltool="/usr/local/mysql-3307/bin/mysql-h192.168.1.107-uroot-pw!zl7POg27-P3307"
declare-aslave_stat
slave_stat=($($sltool-e"showslavestatus\G"|grepRunning|awk'{print$2}'))
if["${slave_stat[0]}"="Yes"-a"${slave_stat[1]}"="Yes"]
then
echo"OKslaveisrunning"
exit0
else
echo"Criticalslaveiserror"
echo
echo"*********************************************************"
echo"NowStartingreplicationwithMasterMysql!"
file=`$mstool-e"showmasterstatus\G"|grep"File"|awk'{print$2}'`
pos=`$mstool-e"showmasterstatus\G"|grep"Pos"|awk'{print$2}'`
$sltool-e"slavestop;changemastertomaster_host='192.168.1.106',master_port=3307,master_user='repl',master_password='w!zl7POg27',master_log_file='$file',master_log_pos=$pos;slavestart;"
sleep3
$sltool-e"showslavestatus\G;"|grepRunning
echo
echo"NowReplicationisFinished!"
echo
echo"**********************************************************"
exit2
fi
运行后效果,如下:
#./slave_stop3307.sh ******************************* NowstopSlaveReplication! Slave_IO_Running:No Slave_SQL_Running:No ******************************* #./slave_repl3307.sh Criticalslaveiserror ********************************************************* NowStartingreplicationwithMasterMysql! Slave_IO_Running:Yes Slave_SQL_Running:Yes NowReplicationisFinished! **********************************************************