今天我们开始学习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;
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;
我们在这个事件中指定了执行时间是‘2021-10-12 14:20:54’,看下效果:
可以看到,我们没有进行任何调用,’2021-10-12 14:20:54’这个时间点一到,MySQL自动帮我们插入了一条数据。
细心的你可能会发现一个问题,在事件发生之后,我们使用SHOW EVENTS命令再查看事件的时候,显示的空结果集,请看下面小提示。小提示在某个时间点执行的事件,在执行完事件后,默认情况是会把该事件删除掉,也可以不删除,那么就在AT … 语句和DO … 语句中间加ON COMPLETION PRESERVE,指定某个时间点执行的事件执行完成后就不会被删除了。就像下图这样。
除了直接填某个时间常量,我们也可以填写一些表达式:
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 ;
其中的EVERY 3 SECOND表示该事件将每隔3秒执行一次。默认情况下,采用这种每隔一段时间执行一次的方式将从创建事件的事件开始,无限制的执行下去。查看下我们表里的数据:(确认是每隔3秒插入一条数据)
我们也可以指定该事件开始执行时间和截止时间:
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这些单位,根据具体需求选用我们需要的时间间隔单位。※ 举几个栗子🌰:
ON SCHEDULE EVERY 1 MINUTE
ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR)
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR)
ON SCHEDULE EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK
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性能等因素,所以,如果使用的话,千万要做好性能评估和权限校验。