MySQL之EVENT事件


今天我们开始学习EVENT事件,今天的内容很少,生产中事件的使用度也不是很高。我们一起开始今天的学习吧。

本文摘录自小孩子4919《MySQL是怎样使用的:从零蛋开始学习MySQL》

事件

事件概念

有时候我们想让MySQL服务器在某个时间点或者每隔一段时间自动地执行一些语句,这时候就需要去创建一个事件。其实我觉得MySQL的事件就和Linux操作系统的定时任务一样(Crontab),设置某个时间点或者按照设置的时间频率执行某些特定任务。和TRIGGER触发器一样,也不用像FUNCTION函数和PROCEDURE存储过程需要进行调用触发,事件只需要到设定的时间MySQL服务器自动触发

使用事件

创建事件

创建事件的语法如下:

CREATE EVENT 事件名ON SCHEDULE{    AT 某个确定的时间点|    EVERY 期望的时间间隔 [STARTS datetime][END datetime]}DOBEGIN    具体的语句END

事件的两种自动执行方式

1、在某个确定的时间点执行;

2、每隔一段时间执行一次。
为了方便说明,我们创建一张测试表:

CREATE TABLE `test_event` (  `id` INT(11) NOT NULL AUTO_INCREMENT,  `remark` VARCHAR(20) DEFAULT NULL,  `create_time` TIMESTAMP,  PRIMARY KEY (`id`)) ENGINE=InnoDB;
MySQL,EVENT事件,服务器自动触发,管理事件

1、先创建一个在某个时间点执行的事件:

DELIMITER $$CREATE EVENT insert_test_eventON SCHEDULEAT '2021-10-12 14:20:54'DOBEGIN    INSERT INTO test_event(id, remark, create_time) VALUES(NULL, 'GrowthDBA', NOW());END $$DELIMITER ;SHOW EVENTS;
MySQL,EVENT事件,服务器自动触发,管理事件

我们在这个事件中指定了执行时间是‘2021-10-12 14:20:54’,看下效果:

MySQL,EVENT事件,服务器自动触发,管理事件

可以看到,我们没有进行任何调用,’2021-10-12 14:20:54’这个时间点一到,MySQL自动帮我们插入了一条数据。
细心的你可能会发现一个问题,在事件发生之后,我们使用SHOW EVENTS命令再查看事件的时候,显示的空结果集,请看下面小提示。小提示在某个时间点执行的事件,在执行完事件后,默认情况是会把该事件删除掉,也可以不删除,那么就在AT … 语句和DO … 语句中间加ON COMPLETION PRESERVE,指定某个时间点执行的事件执行完成后就不会被删除了。就像下图这样。

MySQL,EVENT事件,服务器自动触发,管理事件

除了直接填某个时间常量,我们也可以填写一些表达式:

DELIMITER $$CREATE EVENT insert_test_eventON SCHEDULEAT DATE_ADD(NOW(), INTERVAL 2 DAY)DOBEGIN    INSERT INTO test_event(id, remark, create_time) VALUES(NULL, 'GrowthDBA', NOW());END $$DELIMITER ;

其中的DATE_ADD(NOW(), INTERVAL 2 DAY)表示该事件将在当前时间的两天后执行。大家感兴趣可以下来自己试一下。

2、我们再来创建一个每隔一段时间执行一次的事件:

DELIMITER $$CREATE EVENT insert_test_event_3sON SCHEDULEEVERY 3 SECONDDOBEGIN    INSERT INTO test_event(id, remark, create_time) VALUES(NULL, 'GrowthDBA', NOW());END $$DELIMITER ;
MySQL,EVENT事件,服务器自动触发,管理事件

其中的EVERY 3 SECOND表示该事件将每隔3秒执行一次。默认情况下,采用这种每隔一段时间执行一次的方式将从创建事件的事件开始,无限制的执行下去。查看下我们表里的数据:(确认是每隔3秒插入一条数据)

MySQL,EVENT事件,服务器自动触发,管理事件

我们也可以指定该事件开始执行时间和截止时间:

DELIMITER $$CREATE EVENT insert_test_event_3sON SCHEDULEEVERY 3 SECOND STARTS '2021-10-13 00:00:00' ENDS '2021-10-13 23:59:59'DOBEGIN    INSERT INTO test_event(id, remark, create_time) VALUES(NULL, 'GrowthDBA', NOW());END $$DELIMITER ;

如上所示,该事件将从’2021-10-13 00:00:00’开始直到’2021-10-13 23:59:59’为止,中间每隔3秒执行一次。在创建好事件之后我们就不用管了,到了指定时间,MySQL服务器会帮我们自动执行的。小提示表示事件间隔的单位除了HOUR,还可以用YEAR、QUARTER、MONTH、DAY、HOUR、 MINUTE、WEEK、SECOND、YEAR_MONTH、DAY_HOUR、DAY_MINUTE、DAY_SECOND、HOUR_MINUTE、HOUR_SECOND、MINUTE_SECOND这些单位,根据具体需求选用我们需要的时间间隔单位。※ 举几个栗子🌰:

  • 每隔1分钟执行
ON SCHEDULE EVERY 1 MINUTE
  • 每天凌晨1点执行
ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR)
  • 每个月的第1天凌晨1点执行
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR)
  • 每3个月,从现在起1周后开始
ON SCHEDULE EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK
  • 每12个小时,从现在起30分钟后开始,并于现在起4个星期后结束
ON SCHEDULE EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK

管理事件

查看当前数据库中定义的所有事件的语句:

SHOW EVENTS;SELECT * FROM information_schema.EVENTS;

查看某个具体的事件的定义:

SHOW CREATE EVENT 事件名;

删除事件:

DROP EVENT 事件名;

启动一个事件:

ALTER EVENT 事件名 ENABLE;

关闭一个事件:

ALTER EVENT 事件名 DISABLE;

小提示默认情况下,MySQL服务器并不会帮助我们执行事件,除非我们使用下边的语句手动开启该功能。event_scheduler其实是一个系统变量,它的值也可以在MySQL服务器启动的时候通过启动参数或者通过配置文件来设置event_scheduler的值。

SET GLOBAL event_scheduler = ON;

小结

今天的内容少并且比较简单,下面做一下总结:

1、MySQL的事件就和Linux操作系统的定时任务一样(Crontab),创建好事件之后我们就不用管了,到了指定时间,MySQL服务器会帮我们自动执行指定的任务;

2、事件有两种自动执行的方式:①在某个确定的时间点执行;②每隔一段时间执行一次;

3、在某个时间点执行的事件,在执行完事件后,默认会把该事件删除掉,通过在AT … 语句和DO … 语句中间加ON COMPLETION PRESERVE来取消自动删除;
4、管理事件的语法:创建、查看、删除、启动\关闭,还举了一些例子,大家可以按需使用。
今天主要学习了MySQL的EVENT事件,介绍了什么是事件以及如何使用事件,并且讲解了管理事件的语法。一般生产环境我们很少使用事件,毕竟需要考虑MySQL性能等因素,所以,如果使用的话,千万要做好性能评估和权限校验。