MySql定时任务是利用了事件调度器(Event Scheduler)的功能。
事件调度器可以用来做定时执行某些特定任务(例如:删除记录、对数据进行汇总、数据备份等等),来取代原先只能由操作系统的计划任务来执行的工作。
事件调度器是基于特定时间周期触发来执行某些任务。
事件调度器
在定时功能之前必须确保event_scheduler已开启
操作
命令
查询事件调度器是否开启
show variables like '%event_scheduler%';
开启事件调度器
set global event_scheduler =1;
关闭事件调度器
set global event_scheduler =0;
事件(EVENT)
Event的常用操作
创建事件命令详解
语法:
CREATE EVENT [IF NOT EXISTS] `事件名称`
ON SCHEDULE 计划任务时刻表
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql语句;
计划任务时刻表
有两种功能的设定计划任务时刻表
间隔
语法
时间戳
语法
[ON COMPLETION [NOT] PRESERVE]:
ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。
而PRESERVE的作用是使事件在执行完毕后不会被Drop掉,建议使用该参数,以便于查看EVENT具体信息
如何判断一个事件是否已经开启了
使用show events;查看Status字段值
应用举例
1.连接mysql数据库
mysql -h 127.0.0.1 -P 3306 -u root -p
2.切换到test数据库
use test;
3.设置事件调度器为开启状态
set global event_scheduler =1;
4.创建user表
create table user(id int(4) primary key not null auto_increment,name varchar(16) not null);
示例1:
创建事件:每间隔10秒向user表中插入一条记录,当然第0秒的时候已经插入了一条记录了
create event `myevent1` on schedule every 10 second do insert into user (name) values('cgm');
然后等到第11秒时执行select * from user;发现数据库中已经有2条记录了。
关闭事件
然后ALTER EVENT `myevent1` DISABLE;然后等待30秒之后执行select * from user;发送数据库中还是只有2条记录
示例2:
创建事件:在当前时间戳后的10秒钟这个时间点插入一条数据到user表,注意在第0秒的时候是不会执行插入数据操作的
create event `myevent2` ON SCHEDULE AT CURRENT_TIMESTAMP+INTERVAL 10 SECOND DO insert into user (name) values('cgm');
然后等到第11秒时执行select * from user;发现数据库中只有1条记录。
然后执行show events;发现并没有myevent2事件了。这是因为这个myevent2事件在执行完毕之后,就自动drop掉了,所以查询不到。
示例3:
创建事件:在当前时间戳后的10秒钟这个时间点插入一条数据到user表,注意在第0秒的时候是不会执行插入数据操作的
create event `myevent2` ON SCHEDULE AT CURRENT_TIMESTAMP+INTERVAL 10 SECOND ON COMPLETION PRESERVE DO insert into user (name) values('cgm');
然后等到第11秒时执行select * from user;发现数据库中只有1条记录。
然后执行show events;可以查询到myevent2事件。这是因为在创建myevent2事件时增加了ON COMPLETION PRESERVE,那么当事件执行完毕后,不会自动drop掉myevent2事件了。
然后执行DROP EVENT IF EXISTS `myevent2`;删除事件,然后执行show events;就查不到myevent2事件了
备注:ON COMPLETION PRESERVE代表事件执行完毕之后不删除事件记录
ON COMPLETION NOT PRESERVE代表事件执行完毕之后删除事件记录,而且这个是默认值
示例4:
创建事件:在给定的时间点清空user表内容。
CREATE EVENT `myevent3` ON SCHEDULE AT TIMESTAMP '2019-07-01 15:42:00' DO TRUNCATE TABLE user;
当时间走到2019-07-01 15:42:00时执行select * from user;发现数据库被清空了。
当时间走到2019-07-01 15:42:00时执行show events;发现查询不到myevent3时间了,因为事件已经执行完毕了。
示例5:
创建事件:设置一个每10秒钟向数据库插入一条数据的事件,从30秒后开始,到55秒后结束,事件持续事件为25秒,当执行完毕后插入3条记录
CREATE EVENT `myevent4` ON SCHEDULE every 10 second STARTS CURRENT_TIMESTAMP+INTERVAL 30 second ENDS CURRENT_TIMESTAMP+INTERVAL 55 second DO insert into user (name) values('cgm');
等到第55秒的时候执行select * from user;发现数据库中只有3条记录。
等到第55秒的时候执行show events;发现查询不到myevent4事件,因为这个事件已经执行完毕了。