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; #关闭