mysql主从同步是否异常_运维派 企业面试题1 监控MySQL主从同步是否异常

企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:

阶段1:开发一个守护进程脚本每30秒实现检测一次。

阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误。

阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分)

#假设文件为/log/test/mysql/err

#假设错误为: error:1120:...

#!/bin/bash

#

#监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:

#阶段1:开发一个守护进程脚本每30秒实现检测一次。

#阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误。

#阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分)

#假设文件为/log/test/mysql/err

#假设错误为: error:1120:...

#

#version0.1#

errlocate='/log/test/mysql/err'declare-a errnums

declare-i j=0

functionmsgbox(){echo "MySQL error number is $1" | mail -s mysql.error.alert root

}while true; do

if [ `grep 'error:[[:digit:]]\+:' ${errlocate}` ];then

for i in `grep -o 'error:[[:digit:]]\+:' ${errlocate} | grep -o '[[:digit:]]\+'` ; doerrnums[$j]=$i;case ${errnums[$j]} in

1158) continue;;1159) continue;;1008) continue;;1007) continue;;1062) continue;;*);;esac

#echo "mysql.errnums=${errnums[$j]}" 测试用msgbox ${errnums[$j]}

let j++

#echo "j=$j" 测试用

done

#echo "it should be sleeped" 测试用

sleep30s

j=0

else

sleep30s

#没有报错就直接等待30sfi

done

后台运行之:

-113-[root@vm]18:25 /tmp/sh # chmod -x ywtest1.sh

-114-[root@vm]18:26 /tmp/sh # .ywtest1.sh &

不过这个办法并不绝对可靠, 再使用pstree命令时, 自动退出了:

43fe21fa47870ccbf3282580ac60b562.png

使用 crontab -e创建守护进程, 同时也要取消源代码中的while循环

参考:

-115-[root@vm]18:25 /tmp/sh # crontab -e* * * * * /bin/bash /tmp/sh/ywtest1.sh

* * * * * sleep 30s;/bin/bash /tmp/sh/ywtest1.sh

看一下执行效果:

ffd5628687cc9bbec1840f94d0d906a6.png

每分钟两封邮件, 即30s一封

但是, 这样会产生一个问题, 当有多个错误码时, 每个错误码都会发一封邮件, 而其本身就是30s执行一次, 所以应该把一次执行的报错结果, 集中到一封邮件中;

解决办法: 修正msgbox函数, 直接输出errnums数组, 不需要参数;

输出数组问题: case屏蔽掉的也会输出出来, 原因在于先赋值给数组后进行筛选

解决办法: 改变赋值次序;

最终版本:

#!/bin/bash

#

#监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:

#阶段1:开发一个守护进程脚本每30秒实现检测一次。

#阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误。

#阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分)

#文件为/log/test/mysql/err

#错误为: error:1120:...

#

#version0.1#

errlocate='/log/test/mysql/err'declare-a errnums

declare-i j=0

functionmsgbox(){echo "MySQL error number is ${errnums[@]}" | mail -s mysql.error.alert root

}

#删掉whileif grep 'error:[[:digit:]]\+:' ${errlocate};then

for i in `grep -o 'error:[[:digit:]]\+:' ${errlocate} | grep -o '[[:digit:]]\+'` ; do

case $i in #改变赋值给数组的次序

1158) continue;;1159) continue;;1008) continue;;1007) continue;;1062) continue;;*);;esac#echo "mysql.errnums=${errnums[$j]}"errnums[$j]=$i;

let j++#echo "j=$j"

done#echo "it should be sleeped"msgbox #取消参数传递, 直接使用数组输出sleep30s

j=0

else

sleep30s

#没有报错就直接等待30sfi

8278d3f7758b471837e0ac22037e3021.png

ea857e6c77141f21ccf841690b62efc0.png

DONE, 后续敬请期待!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值