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