MySQL定时任务(事件)创建

1 查看定时器是否开启

SHOW VARIABLES LIKE 'event_scheduler';
或者
select @@event_scheduler;

如果提示OFF,按下述方法开启

set global event_scheduler = on;
或者
set global event_scheduler = 1;

上述方法在MySQL重启后会恢复默认状态,建议在配置文件[mysqld]部分下添加或修改

event_scheduler = on;

2 创建存储过程

delimiter //
create procedure test()
begin
set @times=now();
insert into test (name, content, times) values ('123','456',@times);
end //
delimiter ;
# test()代表存储名称


#特别注意
delimiter 该函数用来定义结束标识,一条sql语句结束时的;号,就是结束标识,网上都说需要先修改结束标识,例如改为//或者$$,但是测试后发现一直报错,几次尝试下发现,在不修改标识正常创建存储过程时,存储过程创建成功,代码如下:

create procedure test()
begin
set @times=now();
insert into test (name, content, times) values ('123','456',@times);
end;

#调用test()存储过程
call test();
# 查看存储过程
show procedure status;
show procedure status like '存储名称'; 
# 删除存储过程
drop procedure if exists test;

3 创建定时任务

create event if not exists aaa
on schedule every 1 minute
on completion preserve
do call test();

# aaa 代表定时任务名称
# on schedule every 1 minute 表示每分钟执行
# on completion preserve 当定时任务到期,定时任务会被关闭,但定时任务依旧存在
# on completion not preserve 网上大多数表示定时任务到期后,定时任务会被删除,但测试后发现,定时任务依旧存在,不知道是不是我测试的问题
# do call test() 表示调用存储过程
#定时任务运行周期设定
on schedule every 1 second  #每秒执行1次
on schedule every 1 minute  #每分钟执行1次
on schedule every 1 hour    #每小时执行1次
on schedule every 1 day     #每天执行1次
on schedule every 1 week    #每周执行1次
on schedule every 1 quarter #每个季度执行1次
on schedule every 1 month   #每月执行1次
on schedule every 1 year    #每年执行1次

# 但凡按上述写法,并且不加starts开始时间的,每次执行的时间都为定时任务的创建时间。
# 简单的说,你在2021-10-01 15:30:30创建了定时任务,并且只定义了every 1 month执行,那么下一次执行时间便是在2021-11-01 15:30:30,并非2021-11-01 00:00:00。

# 3天后执行
on schedule at current_timestamp()+interval 3 day

# 3分钟后执行
on schedule at current_timestamp()+interval 3 minute

# 2021年10月1日上午10点执行
on schedule at '2021-10-01 10:00:00'

# 3天后开始每天执行,到下个月结束
on schedule every 1 day
starts current_timestamp()+interval 3 day 
ends current_timestamp()+interval 1 month

# 每天执行,3天后结束
on schedule every 1 day
ends current_timestamp()+interval 3 day

# 每天3点30分执行
on schedule every 1 day
starts date_add(date_add(adddate(curdate(),1),interval 3 hour),interval 30 minute)
# 或者是
on schedule every 1 day
starts '2021-10-01 03:30:00'

#每月1号3点30分执行
on schedule every 1 month
starts date_format(current_timestamp(),'%Y-%m-%01 %03:%30:%00')
# 或者
on schedule every 1 month
starts '2021-10-01 03:30:00'
# 查看定时任务
show events;
# 删除定时任务
drop event if exists aaa;

4 运行定时任务

alter event aaa on completion preserve enable;  #运行
alter event aaa on completion preserve disable;  #关闭