21. Mysql 事件或定时任务,解放双手,轻松实现自动化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 21. Mysql 事件或定时任务,解放双手,轻松实现自动化

概念

Mysql 事件是一种在特定时间点自动执行的数据库操作,也可以称呼为定时任务,它可以自动执行更新数据、插入数据、删除数据等操作,无需人工干预。

优势:

  • 自动化:可以定期执行重复性的任务,无需手动干预。
  • 灵活性:可以根据需求定制事件,灵活控制任务的执行时间和频率。
  • 提高效率:可以在非高峰时段执行耗时任务,减少对数据库性能的影响。

常见的应用场景有定时备份数据库,清理和统计数据。

常见操作

事件调度器操作

查看事件调度器是否开启:ON 表示已开启。

show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

开启和关闭事件调度器:

# 开启事件调度器
set global event_scheduler = ON;
# 关闭事件调度器
set global event_scheduler = OFF;

更改配置文件:进入 my.ini 文件修改,重启 Mysql 服务器,永久生效。

# 事件调度器启动状态
event_scheduler = on

查看事件

使用 show 或者 select 语句查看当前数据库中所有的事件。

show events;
select * from information_schema.events;

创建事件

使用 create event 语句创建一个事件,

基本语法:

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 复合结构。schedule_body 语法:
at timestamp [+ interval interval] ...
    | every interval
        [starts timestamp [+ interval interval] ...]
        [ends timestamp [+ interval interval] ...]
  • at timestamp:用于一次性活动,指定事件仅在 timestamp 给出的日期和时间执行一次,时间戳必须同时包含日期和时间,或者必须是解析为日期时间值的表达式,如果日期已过,则会出现警告。
# 相当于“三周两天后”。此类子句的每个部分必须以+ interval。
at current_timestamp + interval 3 week + interval 2 day

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}
  • 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 语句删除该事件。

drop event [if exists] event_name;

启动与关闭事件

使用 alter event 语句对事件进行修改。

# 启动事件
alter event event_name enable;
# 关闭事件
alter event event_name disable;

精选示例

构造实时数据

需求:每分钟录入关于产品、省份的订单销售数据。

# 表新建
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;

通过创建事件后,过一段时间再一次查看表,可以发现每条记录 create_time 相差1,说明任务调度设置成功,这样就可以自动模拟实时销售数据啦。

如果要停止录入,可以执行以下代码关闭事件。

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;

该存储过程来自上一文章:Mysql 游标的定义和使用,在这里我们直接引用他来创建定时任务

总结

创建事件或定时任务可以解决很多重复性工作,配合着动态 sql 和存储过程能起到实时更新数据功能,不需要人工干预,提高了工作效率,让我们有更多的时间学习和处理其它问题。

参考资料

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
机器学习/深度学习 人工智能 运维
基于AI的自动化事件响应:智慧运维新时代
基于AI的自动化事件响应:智慧运维新时代
74 11
|
4月前
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
81 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
3月前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
71 1
|
5月前
|
存储 弹性计算 运维
自动化监控和响应ECS系统事件
阿里云提供的ECS系统事件用于记录云资源信息,如实例启停、到期通知等。为实现自动化运维,如故障处理与动态调度,可使用云助手插件`ecs-tool-event`。该插件定时获取并转化ECS事件为日志存储,便于监控与响应,无需额外开发,适用于大规模集群管理。详情及示例可见链接文档。
|
6月前
|
SQL 数据采集 关系型数据库
|
6月前
|
关系型数据库 MySQL 机器人
【MySQL】两个脚本自动化搞定 MySQL 备份恢复--XtraBackup
【MySQL】两个脚本自动化搞定 MySQL 备份恢复--XtraBackup
|
8月前
|
运维 监控 安全
自动化运维:解放双手,提升效率
【6月更文挑战第19天】本文将深入探讨自动化运维的重要性和优势,以及如何实现自动化运维。我们将从自动化运维的定义开始,然后讨论它的优势,包括提高效率、减少错误、节省成本等。接下来,我们将详细介绍如何实现自动化运维,包括选择合适的工具和技术、设计自动化流程、测试和优化等步骤。最后,我们将通过一个实际案例来展示自动化运维的实施过程和效果。
|
8月前
|
运维 监控
自动化运维:解放双手,提升效率
【6月更文挑战第18天】在数字化时代,运维工作的复杂性和重要性日益凸显。传统的人工运维方式已经难以满足现代企业的需求。自动化运维作为一种新兴的运维模式,通过引入自动化工具和技术,实现对IT资源的高效管理。本文将介绍自动化运维的概念、优势以及实施步骤,帮助读者更好地理解和应用自动化运维。
|
8月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之同步MySQL数据并EP(复杂事件处理)时,编译报错,如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
133 1
|
7月前
|
运维 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在处理MySQL表新增数据记录时,没有正确触发变更事件,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。