#!/bin/bash
#########################################################
# this script. function is:
# check_mysql_slave_replication_status
# USER YYYYY-MM-DD -ACTION
# yping 2017-04-15
#########################################################
path=/server/scripts
MAIL_GROUP="5188@qq.ocm 5199@qq.com"
PAGER_GROUP="15112530452"
USER=root
PASSWORD=yping
PORT=3307 #<== 端口
MYSQLCMD="
mysql -u$USER -p$PASSWORD -S /data/$PORT/mysql.sock"
error=(1008 1007 1062) # <== 可以忽略的主从复制错误号
RETVAL=0
[ ! -d "$path ] && mkdir -p $path
function JudgeError(){ # <== 如果传入的错误号和数组里的元素相匹配,则执行then后面的命令。
for((i=0;i<${#error[*]};i++))
do
if [ "$1" == "${error[$i]}" ]
then
echo "MySQL slave errorno is $1, auto repairing it."
$MYSQLCMD -e "stop slave; set global sql_slave_skip_counter=1; start slave;" # <== 自动修复
fi
done
return $1
}
function CheckDb() { # <== 定义检查
数据库主从复制状态的函数
status=($(awk -F ':' '/_Running | Last_Errno | _Behind/{print $NF}' slave.log ))
expr ${status[3]} + 1 &>/dev/null # <== 这个是延迟状态值,用于进行是否为数字的判断
if [ $? -ne 0 ];
then
status[3]=300
fi
if [ "${starts[1]}" == "Yes" -a "${starts[1]}" == "Yes" -a "${starts[3]}" -lt 120 ]
# <== 两个线程都为Yes,并且延迟小于120秒,即认为复制状态是正常的
then
#echo "Mysql replcation is ok "
return 0
else
#echo "Mysql replcation is failed "
JudgeError ${starts[2]} # <== 否则,将错误号${starts[2]}传入JudgeError函数,判断错误号是否可以自动修复
fi
}
function MAIL() { # <== 定义邮件函数
local SUBJECT_CONTENT=$1 # <== 将函数的第一个传参赋值给主题变量。
for MAIL_USER in `echo $MAIL_GROUP` # <== 遍历邮件列表。
do
mail -s "SUBJECT_CONTENT " $MAIL_USER <$LOG_FILE # <== 发邮件
done
}
function PAGER() {
for PAGER_USER in `echo $PAGER_GROUP`
do
TITLE=$1 # <== 将函数的第一传参赋值给主题变量。
CONTACT=$PAGER_USER # <== 将
手机号赋值给CONTACT变量。
curl -d cdkey=5ADF-EFA -d password=yping -d phone=$CONTACT -d message="$TITLE[$2]" $HTTPGW
done
}
function SendMsg() {
if [ $1 -ne 0 ] # <== 传入第一个参数,如果不为0,则表示复制有问题,这里的$1即为CheckDb里的返回值
then
RETVAL=1
NOW_TIME=`date +"+Y-%m-%d %H:%M:%S"` # <== 报警时间
SUBJECT_CONTENT="mysql slave is error, errorno is $2, ${NOW_TIME}." # <==报警主题
echo -e "$SUBJECT_CONTENT" | tee $LOG_FILE # <== 输出信息,并
记录到日志
MAIL $SUBJECT_CONTENT # <== 邮件报警
PAGER $SUBJECT_CONTENT $NOW_TIME # <== 发短信
else
echo "Mysql slave status is ok"
RETVAL=0
fi
return $RETVAL
}
function main() {
while true
do
checkDb
SendMsg $?
sleep 10
done
}
main