参考:https://blog.51cto.com/zxlwz/1856283

企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。

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

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

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

PS:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误,需要在从机的my.cnf文件中增加slave_skip_errors

[mysqld]
slave-skip-errors=1158,1159,1008,1007,1062

mysql从机中配置邮件告警

1.yum install mailx sendmail -y
2.vim /etc/mail.rc
# send mail
set from=qqzgqq@126.com
set smtp=smtp.126.com
set smtp-auth-user=qqzgqq@126.com
set smtp-auth-password=password
set smtp-auth=login
[root@6b1092cdb680 shtext]#mail -s "zhuti" -a if1.sh 邮箱地址
-s后面接邮件主题;-a后接文件作为附件发送,上述命令完成后可输入正文部分
最后ctrl+d 结束并发送
[root@6b1092cdb680 shtext]#echo "内容" | mail -s "zhuti2" 邮箱地址
回车后直接发送。
PS:
1.服务器需能访问外网。
2.smtp端口为25,如有防火墙需开启。
**提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:**
[root@oldboy~]# mysql -uroot -p'oldboy' -S /data/3307/mysql.sock -e "show slavestatus\G;" *************************** 1. row *************************** Slave_IO_State:Waiting for master to send event Master_Host:10.0.0.179 #当前的mysql master服务器主机 Master_User: rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File:mysql-bin.000013 Read_Master_Log_Pos: 502547 Relay_Log_File:relay-bin.000013 Relay_Log_Pos:251 Relay_Master_Log_File:mysql-bin.000013 Slave_IO_Running:Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: mysql Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 502547 Relay_Log_Space:502986 Until_Condition:None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 #和主库比同步延迟的秒数,这个参数很重要 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: [root@node2 ~]# cat check_slave.sh #!/bin/bash #destination : this is a check mysql slave heath ! slave_status=(`mysql -uroot -p123456 -e 'show slave status\G'|grep Running |awk '{print $2}'`) if [ "${slave_status[0]}" = "Yes" -a "${slave_status[1]}" = "Yes" ] ;then echo "mysql_slave Running!" exit 0 fi Last_Err=`mysql -uroot -p123456 -e 'show slave status\G'|grep Last` echo ${Last_Err[@]} |mail -s "mysql主从同步异常" 邮箱地址 [root@node2 ~]# echo "*/2 * * * * nohup /root/check_slave.sh 2>&1 &" >> `find /var/spool/cron -name "root"`