Mysql 创建心跳表来监控Replication的Slave是否延迟

mysql replication的slave同步是否真实延迟,大部分人都是在slave上执行show slave status\G来捕获Slave_IO_Running: Yes和Slave_SQL_Running: Yes和Seconds_Behind_Master: 0这三列信息,今天我们自己另辟蹊跷不同过show slave status\G来捕获,而是直接监控master库的数据是否真实写入到slave库

1、Master上的mysql库上创建心跳表Heartbeat_table

CREATE TABLE `heartbeat_table` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `master_datetime` datetime NOT NULL,
  `slave_datetime` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

2、Master上的mysql库上创建一个存储过程往心跳表Heartbeat_table插数据

delimiter $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_insert_heartbeat_table`()
BEGIN
DECLARE  master_datetime datetime;
declare  slave_datetime  datetime;
INSERT INTO Heartbeat_table (master_datetime,slave_datetime) VALUES(NOW(),SYSDATE());
END$$

3、Master上的mysql库上创建创建一个事件每分钟执行一次步骤2的存储过程

CREATE EVENT event_replication_insert ON SCHEDULE EVERY 60 SECOND  DO call sp_insert_heartbeat_table();

4、Master上的mysql库上创建创建一个事件每分钟删除心跳表3天前的记录

CREATE EVENT event_replication_delete ON SCHEDULE EVERY 60 SECOND  DO delete from Heartbeat_table where id in (select id from (select id from Heartbeat_table c1 where UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(master_datetime)>259200) t1)

5、在slave服务器上编写一个监控slave同步的邮件的脚本,延迟超过120秒就报警

#!/bin/bash
mysql_user="root"
mysql_pass="pwd"
hostname=echo `hostname`

delay=`/usr/bin/mysql -u${
    
    mysql_user} -p${
    
    mysql_pass} -e"SELECT NOW()-MAX(master_datetime) FROM mysql.heartbeat_table"`
delay_seconds=`echo $delay |awk '{print $2}'`

if [ "$delay_seconds" -gt 120 ];then
                echo "$hostname Mysql Salve delay $delay_seconds seconds,please check!!!"| mailx  -s "$hostname Mysql Salve delay $delay_seconds seconds,please check!!!" emailname@XX.com
fi

Guess you like

Origin blog.csdn.net/lusklusklusk/article/details/120023046