Mysql 定时任务event
什么是事件
事件是mysql5.1引入的一种新的存储代码的方式,类似于linux的定时任务,不过它完全是mysql内部实现的,你可以创建事件,指定mysql在某个时候执行一段sql代码,或者间隔一个时间执行一段sql代码,通常我们把复杂的sql都封装到一个存储过程中去,然后事件只是简单的调用该存储过程。
事件是在一个独立的事件调度线程中被初始化,这个和处理连接的进程没有任何关系,它不接受任何参数,也没有任何返回值,可以在mysql的日志中看到该命令的执行日志,还可以通过 information_schema.EVENTS看到各个事件的状态,比如最后一次执行时间等。
典型应用场景:
定期维护任务、重建缓存、构建汇总表来模拟物化视图,或者存储用于监控和诊断的状态值等
注意: 如果一个任务执行很长时间,前面的事件还没完成,下一个时间点又开始了, mysql本身是不会防止这种并发的,所以需要用户自己编写这种情况下防止并发代码,我们可以使用函数get_lock()来确保当前总是只有一个事件被执行
我们来看下如何定义一个event
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE] 可选项 默认是执行完不删除该事件 如果用 not preserve 则执行完后,即刻删除该event
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
DO event_body;
schedule:
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
查看event 是否开启
show variables like 'event_scheduler';
开启event
set global event_scheduler=1;
查看所有event
select * from information_schema.EVENTS;
删除event
drop event event_name
禁用/启用 event (默认是启用的)
alter event event_name enable /disable
创建:
create event if not exists myevent on schedule every 1 week
do
insert into test.test(id) values(1)
修改event
Alter event myevent on schedule every 1 week
do
insert into test.test(id) values(2)
创建时间间隔5秒例子
创建一个表
create table test.event_test(id int key auto_increment,dt datetime);
创建event 插入数据
create event if not exists schedult_event on schedule every 5 second
comment ‘时间间隔5秒的例子’
do
insert into test.event_test(dt) values( curdate() );
select *from test.event
这里的时间间隔类型 还有 YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |WEEK | SECOND
创建固定时间例子
create event schedult_event on schedule at '2019-11-25 18:29:03'
do
insert into test.event_test(dt) values( now() );
select * from test.event_test;
创建指定时间范围内周期执行的例子
每天9点50分50秒 到 9点51分0秒期间,每5秒执行一次操作
create event schedult_event on schedule every 5 second
starts timestamp( current_date,'09:50:50')
ends timestamp(current_date, '09:51:00')
do
insert into test.event_test(dt) values( now() );