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! **********************************************************