大家做项目过程中,常常会有需求,需要定时的对数据进行删除、汇总或备份等等,常见的处理方式都是通过操作系统的定时任务进行, 在MySQL 5.1之后的版本中,新增了一个特色功能-Event Scheduler 事件调度器,通过Events创建事件可以定时执行任务,取代原操作系统的任务调度器。
MYSQL官方文档:https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html
1.如何查看事件是否开启
-- 执行命令 查看事件状态
show variables like '%sche%';
event_scheduler 为ON表示已开启,OFF未开启

2.如何开启/关闭事件调度器
事件调度器开启/关闭 有两种方式,一通过命令设置全局参数,二通过mysql启动文件配置。
1.使用SET GLOBAL命令可以开启或关闭事件(需要超级管理的权限)。
-- 开启事件调度器
SET GLOBAL event_scheduler = ON;
-- 关闭事件调度器
SET GLOBAL event_scheduler = OFF;
2.在Mysql的配置文件添加以下代码开启事件(Windows 在 my.ini 文件中,Linux在 my.cnf 中)。
# 事件调度器启动状态
event_scheduler = on
3. 创建事件(定时任务)
示例:
-- 1.首先创建测试表
CREATE TABLE `test` (
`id` int(12) NOT NULL AUTO_INCREMENT COMMENT '1',
`name` varchar(50) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- 2.创建测试用的存过
DROP PROCEDURE IF EXISTS `proc_inset_test`;
CREATE PROCEDURE `proc_inset_test`()
BEGIN
INSERT INTO `test` ( name, create_time) VALUES("测试",now());
END;
-- 3.创建一个事件
-- 每五秒执行一次
DROP EVENT IF EXISTS call_proc_inset_test_5;
CREATE EVENT IF NOT EXISTS call_proc_inset_test_5 ON SCHEDULE EVERY 5 SECOND
ON COMPLETION PRESERVE
DO call proc_inset_test();
查看test表,可以发现事件已经开始执行,事件每隔5秒会执行一次存过插入数据。

常用的时间间隔设置:
-- 每隔5秒钟执行
ON SCHEDULE EVERY 5 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点执行,并于现在起12个星期后结束
ON SCHEDULE EVERY 1 DAY
STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR)
ENDS CURRENT_TIMESTAMP + INTERVAL 12 WEEK
4. 查看事件列表
-- 查看已创建事件信息
SELECT * FROM information_schema.events
5.开启/关闭事件
-- 关闭事件任务
alter event call_proc_inset_test_5 ON COMPLETION PRESERVE DISABLE;
-- 开户事件任务
alter event call_proc_inset_test_5 ON COMPLETION PRESERVE ENABLE;
6.删除事件
DROP EVENT IF EXISTS call_proc_inset_test_5;