MySQL定时任务
1概念
-
自动化: 可以定期执行重复性的任务,无需手动干预。 -
灵活性: 可以根据需求定制事件,灵活控制任务的执行时间和频率。 -
提高效率: 可以在非高峰时段执行耗时任务,减少对数据库性能的影响。
2常见操作
事件调度器操作
show variables like ‘%event_scheduler%’;
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| event_scheduler | ON |
+—————–+——-+
# 开启事件调度器
set global event_scheduler = ON;
# 关闭事件调度器
set global event_scheduler = OFF;
# 事件调度器启动状态
event_scheduler = on
查看事件
show events;
select * from information_schema.events;
创建事件
create
[definer = user]
event
[if not exists]
event_name
on schedule schedule_body
[on completion [not] preserve]
[enable | disable | disable on slave]
[comment ‘comment’]
do event_body;
-
definer
:可选,用于定义事件执行时检查权限的用户。 -
if not exists
:可选,一般都加上,用于判断要创建的事件是否存在。 -
event_name
:定义指定的事件名,是用来唯一标识事件的名称。在同一个数据库中,事件名称必须是唯一的。 -
on schedule schedule_body
:schedule_body 用于定义执行的时间和时间间隔。 -
on completion [not] preserve
:可选,指定事件是否循环执行,默认为一次执行,即 not preserve。 -
enable | disable | disable on slave
:可选,指定事件的一种属性,enable 表示启动,disable 表示关闭或者下线,disable on slave 表示从属性上禁用,默认启动 -
comment ‘comment’
:可选,添加事件的注释。 -
do event_body
:必选,event_body 用于指定事件启动时所要执行的代码,可以是任何有效的sql 语句、存储过程或者一个计划执行的事件。如果包含多条语句,可以使用 begin … end 复合结构。
at timestamp [+ interval interval] …
| every interval
[starts timestamp [+ interval interval] …]
[ends timestamp [+ interval interval] …]
# 相当于“三周两天后”。此类子句的每个部分必须以+ interval。
at current_timestamp + interval 3 week + interval 2 day
interval:
quantity {year | quarter | month | day | hour | minute |
week | second | year_month | day_hour | day_minute |
day_second | hour_minute | hour_second | minute_second}
-
every interval
:每隔一段时间执行事件,指定时间区间内每隔多长时间发生一次,interval 其值由一个数值和单位(quantity)组成,如 4 week 表示 4 周,’1:10’ HOUR_MINUTE
表示1小时10分钟。 -
starts timestamp
:指定事件的开始时间,timestamp 为时间戳,日期时间值表达式。 -
ends timestamp
:指定事件的结束时间,timestamp 为时间戳,日期时间值表达式。
# 每30分钟执行一次
on schedule every 30 minute
# 从 2024-01-03 18:00:00 开始,每1小时执行一次
on schedule every 1 hour
starts ‘2024-01-03 18:00:00’
# 从现在起30分钟后开始,四周后结束,这段期间内每12小时执行一次
on schedule every 12 hour
starts current_timestamp + interval 30 minute
ends current_timestamp + interval 4 week
删除事件
drop event [if exists] event_name;
启动与关闭事件
# 启动事件
alter event event_name enable;
# 关闭事件
alter event event_name disable;
3精选示例
构造实时数据
# 表新建
drop table if exists sql_test1.face_sales_data;
create table if not exists sql_test1.face_sales_data
(
sales_date date comment ‘销售日期’,
order_code varchar(255) comment ‘订单编码’,
user_code varchar(255) comment ‘客户编号’,
product_name varchar(255) comment ‘产品名称’,
sales_province varchar(255) comment ‘销售省份’,
sales_number int comment ‘销量’,
create_time datetime default current_timestamp comment ‘创建时间’,
update_time datetime default current_timestamp on update current_timestamp comment ‘更新时间’
);
# 创建事件任务,多条语句用 begin … end; 包住。
drop event if exists face_sales_data_task1;
create event if not exists face_sales_data_task1
on schedule every 1 minute
starts ‘2024-01-03 21:17:00′
on completion preserve enable
do
begin
set @user_code = floor(rand()*900000000 + 100000000);– 随机生成用户编码,
set @order_code = md5(floor(rand()*900000000 + 100000000));– 根据随机用户编码加密成编码
set @product_name = ELT(CEILING(RAND() * 8) ,’iPhone 15′,’iPhone 15 Pro’,’iPhone 15 Pro Max’,’Xiaomi 14′,’Xiaomi 14 Pro’,’Huawei Mate 60′,’Huawei Mate 60 Pro’,’Huawei Mate 60 Pro+’);– 随机从中选择产品
set @sales_province = ELT(CEILING(RAND() * 34) ,’河北省’,’山西省’,’辽宁省’,’吉林省’,’黑龙江省’,’江苏省’,’浙江省’,’安徽省’,’福建省’,’江西省’,’山东省’,’河南省’,’湖北省’,’湖南省’,’广东省’,’海南省’,’四川省’,’贵州省’,’云南省’,’陕西省’,’甘肃省’,’青海省’,’台湾省’,’内蒙古自治区’,’广西壮族自治区’,’西藏自治区’,’宁夏回族自治区’,’新疆维吾尔自治区’,’北京市’,’上海市’,’天津市’,’重庆市’,’香港特别行政区’,’澳门特别行政区’);
set @sales_number = floor(rand()*1000);– 随机生成销量
select @user_code,@order_code,@product_name,@sales_province,@sales_number;– 查看生成的数据
insert into sql_test1.face_sales_data(sales_date, order_code, user_code, product_name, sales_province, sales_number)
values (curdate(),@order_code,@user_code,@product_name,@sales_province,@sales_number);– 数据录入
end;
select * from sql_test1.face_sales_data;

alter event face_sales_data_task1 disable;
定时统计数据
drop event if exists get_table_info1_task1;
create event if not exists get_table_info1_task1
on schedule every 10 minute
starts current_timestamp
ends current_timestamp + interval 1 week
on completion preserve enable
do call get_table_info1();
# 下线
alter event get_table_info1_task1 disable;
4总结
微信赞赏
支付宝扫码领红包