数据库原理及MySQL应用 | 事件

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 事件由一个特定的线程——事件调度器来管理,事件是根据指定时间表,在某一特定的时间点,触发相关的SQL语句或存储过程。

5.jpeg

01、事件概述

事件(Event)是根据指定时间表执行的任务,是MySQL在相应的时刻调用的过程式数据库对象。它由事件调度器这一特定的线程来管理的。

事件调度器即定时任务调度器,指在某个特定的时间根据计划自动完成指定的任务或每隔多长时间根据计划做一次指定的任务。MySQL的事件调度器可以实现每秒执行一个任务,这在一些对实时性要求较高的环境下是非常实用的。

事件调度器是定时触发执行的,从这个角度上看也可以称其为“临时触发器”。但是它与触发器又有所区别,触发器只针对某张数据表产生的事件(INSERT、UPDATE和DELETE操作)执行特定的任务,而事件调度器则是根据时间周期来触发设定的任务,且操作对象可以是多张数据表。

02、开启或关闭事件调度器

由于事件是由事件调度器这一特定的线程来管理的,因此若想让事件正常执行,首先要开启事件调度器。MySQL 8.0以上是默认开启事件调度器的。

1. 查看事件调度器

可以通过对全局变量event_scheduler的查看,掌握事件调度器的状态,其值为OFF表示关闭,其值为ON表示开启。

查看事件调度器的基本语法格式如下所示。

image.png


三种方法执行后,显示方式稍有不同。

2. 开启或关闭事件调度器

开启事件调度器的基本语法格式如下所示。

image.png


关闭事件调度器的基本语法格式如下所示。

image.png

03、创建事件

MySQL事件信息保存在mysql.event表中,虽然可以直接操作该表,但是容易出现不可预知的错误,因此建议采用CREATE EVENT语句在指定的数据库下创建。创建事件的基本语法格式如下所示。
image.png
其中:

语法说明如下。

event_name是新建事件的名称,事件名称必须符合标识符命名规则,且名称必须唯一。新创建的事件默认属于当前数据库,若要在指定数据库中创建事件,创建时应将名称指定为db_name.event_name。

DEFINER=user是可选选项,用于定义事件创建者,省略表示当前用户。

IF NOT EXISTS是可选选项。添加该选项,表示指定的事件不存在时执行创建事件操作,否则忽略此操作。

ON SCHEDULE schedule表示触发点,用于定义执行的时间和时间间隔,包括2种选项:AT timestamp一般只执行一次,INTERVAL关键字可以用于计算时间间隔,可以直接与日期、时间进行计算;EVERY interval一般周期性执行,STARTS timestamp是可选项,用于设定开始时间,ENDS timestamp是可选选项,用于设定结束时间。

ON COMPLETION [NOT] PRESERVE是可选选项,用于定义事件执行完毕是否保留,默认为NOT PRESERVE不保留,即删除事件。

ENABLE | DISABLE | DISABLE ON SLAVE是可选选项,用于指定事件的属性,包括3种选项:ENABLE表示该事件创建以后是开启的,也就是系统将执行这个事件,为默认选项;DISABLE表示该事件创建以后是关闭的,也就是事件的声明存储到目录中,但是不执行这个事件;DISABLE ON SLAVE表示事件在从机中是关闭的。一般用不上,只有设置了MySQL主从数据库才会用得上,指该事件已在主服务器上创建并复制到从属服务器,但在从属服务器上是关闭的。

COMMENT 'comment'是可选选项,用于定义事件的注释。

DO event_body用于指定事件启动时所要执行的代码,可以是任何有效的SQL语句、存储过程或一个计划执行的事件。如果包含多条语句,可以使用BEGIN…END复合结构。

【例9-25】在图书销售数据库booksale中建立事件event_test1,该事件注释为一次性定时器,设定在2021-08-19 21:30:00将系统时间以字符串的形式插入已经存在的eventtest表中,该表的结构为(id,user, createtime),并验证事件执行的结果。
image.png
以root@localhost这个用户的身份创建一次性定时器,执行时间为2021-08-19 21:30:00,当这个事件不会再发生时会被删除,该事件创建后为开启状态。查询结果存在一条记录,说明事件创建成功。

在事件执行时间2021-08-19 21:30:00之后查看eventtest表,以验证事件是否成功执行。

image.png


执行结果如图1所示。再次查看事件。

image.png


image.png


■ 图9-7事件执行后

事件在设定的执行时间2021-08-19 21:30:00正确执行,并将执行时间插入指定的数据表eventtest中,该事件已经执行完毕,不会再次发生,按创建事件的参数,系统自动将事件删除,因此在查看事件时为空。

【例9-26】在图书销售数据库booksale中建立事件event_test2,该事件为重复性定时器,设定在2021-08-19 21:55:00到2021-08-19 22:00:00每隔1分钟,将系统时间以字符串的形式插入已经存在的eventtest表中,该表的结构为(id,user, createtime),并验证事件执行的结果。

以root@localhost这个用户的身份创建重复性定时器,执行时间为2021-08-19 21:55:00到2021-08-19 22:00:00,执行频率为每分钟一次,执行结束后应该多出6条数据。结束时间也可以不写,那就是从开始时间一直执行。当这个事件不会再发生时也不会被删除,该事件创建后为开启状态,事件结束后为关闭状态。查询结果存在一条记录,说明事件创建成功。

在事件执行结束时间2021-08-19 22:00:00之后查看eventtest表,以验证事件是否成功执行。

image.png


执行结果如图9-8所示。

【例9-27】在图书销售数据库booksale中建立事件event_test3,该事件为重复性定时器,从现在开始的一年内每天删除订单表orders中订购日期大于120天的订单,订单项目表orderitems中的相关联记录同步删除,并验证事件执行的结果。

image.png


事件执行前订单表orders和订单项目表orderitems中的记录如图9-9和图9-10所示。事件执行后订单表orders和订单项目表orderitems中的记录如图9-11和图9-12所示。

image.png


从执行结果可以看到,orders表中订购日期在120天前的记录被删除,同时被删除的订单对应的订单明细从orderitems表中被同步删除。该事件开始时间为创建事件之日起,结束时间为1年后,每天重复执行删除操作。

04、事件管理

1. 查看事件

查看事件的基本语法格式如下所示。

image.png


语法说明如下。

{FROM | IN} db_name是可选选项,用于指出要查看的数据库名,其中FROM | IN关键字可以省略。若未指出数据库,则获取当前选择的数据库。

LIKE 'pattern' | WHERE expr是可选选项。LIKE 'pattern'中pattern是匹配字符串,省略时表示查看所有事件,可使用LIKE结合通配符查看部分事件的值,也可直接写事件名;WHERE expr用于指定查看事件的条件。

【例9-27】查看图书销售数据库booksale中存在的所有事件。

image.png


event_test2事件已经结束,自动调整为关闭状态。event_test3事件还没有结束,仍为开启状态。

【例9-28】查看图书销售数据库booksale中开启的事件。

image.png


事件状态status的值有三种,ENABLED表示事件是开启的,DISABLE表示事件是关闭的,DISABLE ON SLAVE表示事件在从机中是关闭的。

image.png


语法说明如下。

在系统数据库information_schema中的EVENTS表中,可以通过SELECT语句查看事件的定义。

event_name= 'event_name'用于查找event_name列的值为event_name事件名的指定事件的信息。

提示

以上命令没有限定数据库,所以查看的是当前服务器中所有名为event_name的事件,要查看指定数据库,需要添加条件EVENT_SCHEMA=' db_name'。

【例9-29】查看图书销售数据库booksale中名为event_test3的事件。

image.png


在图形化界面中由于列宽问题显示不全,可在命令行状态输入该命令并将“;”替换成“\G”结尾,结果将以垂直方向显示。

2. 修改事件

修改事件可以更改现有事件的各种属性,修改事件的基本语法格式如下所示。

image.png


image.png


语法说明如下。

RENAME TO是重新为事件命名,new_event_name是新的事件名称。若使用db_name.event_name指定事件所属数据库,则是将事件从一个数据库移动到另一个数据库中。

除上面关键字外,其他关键字和参数同创建事件的语法保持一致。

【例9-30】修改图书销售数据库booksale中名为event_test3的事件,将其改名为event_delete,时间频率改为1周,结束时间改为半年。

image.png

3. 禁用事件

临时关闭事件被称为禁用事件,禁用事件的基本语法格式如下所示。

image.png


语法说明:event_name是禁用事件的名称。事件默认属于当前数据库,也可使用db_name.event_name禁用指定数据库中的事件。

【例9-31】修改图书销售数据库booksale中名为event_delete的事件,将其临时关闭。

image.png

4. 启用事件

将禁用事件重新启用被称为启用事件,启用事件的基本语法格式如下所示。

image.png


语法说明:event_name是启用事件的名称。事件默认属于当前数据库,也可使用db_name.event_name启用指定数据库中的事件。

【例9-32】启用图书销售数据库booksale中名为event_delete的事件。

image.png


语法说明如下。

event_name是删除事件的名称。默认删除的是当前数据库中的事件,也可使用db_name.event_name删除指定数据库中的事件。

IF EXISTS是可选选项。添加该选项,表示指定的事件存在时执行删除事件操作,否则忽略此操作。

【例9-33】删除图书销售数据库booksale中名为event_delete的事件。

image.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
24天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
6天前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
3天前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
34 16
|
4天前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
21 7
|
2天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024年小结:感谢阿里云开发者社区每月的分享交流活动,支持持续学习和进步。过去五个月投稿29篇,其中17篇获高分认可。本文详细介绍了MySQL InnoDB存储引擎的MVCC机制,包括数据版本链、readView视图及解决脏读、不可重复读、幻读问题的demo演示。
|
18天前
|
人工智能 容灾 关系型数据库
【AI应用启航workshop】构建高可用数据库、拥抱AI智能问数
12月25日(周三)14:00-16:30参与线上闭门会,阿里云诚邀您一同开启AI应用实践之旅!
|
18天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
44 3
|
18天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
47 3
|
18天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
62 2
|
25天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。