Mysql事件创建定时任务

大家做项目过程中,常常会有需求,需要定时的对数据进行删除、汇总或备份等等,常见的处理方式都是通过操作系统的定时任务进行, 在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未开启

Mysql事件创建定时任务

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秒会执行一次存过插入数据。

Mysql事件创建定时任务

常用的时间间隔设置:

-- 每隔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;