数据库原理及 MySQL 应用 | 事件
事件由一个特定的线程——事件调度器来管理,事件是根据指定时间表,在某一特定的时间点,触发相关的 SQL 语句或存储过程。
01、事件概述
事件(Event)是根据指定时间表执行的任务,是 MySQL 在相应的时刻调用的过程式数据库对象。它由事件调度器这一特定的线程来管理的。
事件调度器即定时任务调度器,指在某个特定的时间根据计划自动完成指定的任务或每隔多长时间根据计划做一次指定的任务。MySQL 的事件调度器可以实现每秒执行一个任务,这在一些对实时性要求较高的环境下是非常实用的。
事件调度器是定时触发执行的,从这个角度上看也可以称其为“临时触发器”。但是它与触发器又有所区别,触发器只针对某张数据表产生的事件(INSERT、UPDATE 和 DELETE 操作)执行特定的任务,而事件调度器则是根据时间周期来触发设定的任务,且操作对象可以是多张数据表。
02、开启或关闭事件调度器
由于事件是由事件调度器这一特定的线程来管理的,因此若想让事件正常执行,首先要开启事件调度器。MySQL 8.0 以上是默认开启事件调度器的。
1. 查看事件调度器
可以通过对全局变量 event_scheduler 的查看,掌握事件调度器的状态,其值为 OFF 表示关闭,其值为 ON 表示开启。
查看事件调度器的基本语法格式如下所示。
三种方法执行后,显示方式稍有不同。
2. 开启或关闭事件调度器
开启事件调度器的基本语法格式如下所示。
关闭事件调度器的基本语法格式如下所示。
03、创建事件
MySQL 事件信息保存在 mysql.event 表中,虽然可以直接操作该表,但是容易出现不可预知的错误,因此建议采用 CREATE EVENT 语句在指定的数据库下创建。创建事件的基本语法格式如下所示。
其中:
语法说明如下。
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),并验证事件执行的结果。
以 root@localhost 这个用户的身份创建一次性定时器,执行时间为 2021-08-19 21:30:00,当这个事件不会再发生时会被删除,该事件创建后为开启状态。查询结果存在一条记录,说明事件创建成功。
在事件执行时间 2021-08-19 21:30:00 之后查看 eventtest 表,以验证事件是否成功执行。
执行结果如图 1 所示。再次查看事件。
■ 图 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 表,以验证事件是否成功执行。
执行结果如图 9-8 所示。
【例 9-27】在图书销售数据库 booksale 中建立事件 event_test3,该事件为重复性定时器,从现在开始的一年内每天删除订单表 orders 中订购日期大于 120 天的订单,订单项目表 orderitems 中的相关联记录同步删除,并验证事件执行的结果。
事件执行前订单表 orders 和订单项目表 orderitems 中的记录如图 9-9 和图 9-10 所示。事件执行后订单表 orders 和订单项目表 orderitems 中的记录如图 9-11 和图 9-12 所示。
从执行结果可以看到,orders 表中订购日期在 120 天前的记录被删除,同时被删除的订单对应的订单明细从 orderitems 表中被同步删除。该事件开始时间为创建事件之日起,结束时间为 1 年后,每天重复执行删除操作。
04、事件管理
1. 查看事件
查看事件的基本语法格式如下所示。
语法说明如下。
{FROM | IN} db_name 是可选选项,用于指出要查看的数据库名,其中 FROM | IN 关键字可以省略。若未指出数据库,则获取当前选择的数据库。
LIKE 'pattern' | WHERE expr 是可选选项。LIKE 'pattern'中 pattern 是匹配字符串,省略时表示查看所有事件,可使用 LIKE 结合通配符查看部分事件的值,也可直接写事件名;WHERE expr 用于指定查看事件的条件。
【例 9-27】查看图书销售数据库 booksale 中存在的所有事件。
event_test2 事件已经结束,自动调整为关闭状态。event_test3 事件还没有结束,仍为开启状态。
【例 9-28】查看图书销售数据库 booksale 中开启的事件。
事件状态 status 的值有三种,ENABLED 表示事件是开启的,DISABLE 表示事件是关闭的,DISABLE ON SLAVE 表示事件在从机中是关闭的。
语法说明如下。
在系统数据库 information_schema 中的 EVENTS 表中,可以通过 SELECT 语句查看事件的定义。
event_name= 'event_name'用于查找 event_name 列的值为 event_name 事件名的指定事件的信息。
提示
以上命令没有限定数据库,所以查看的是当前服务器中所有名为 event_name 的事件,要查看指定数据库,需要添加条件 EVENT_SCHEMA=' db_name'。
【例 9-29】查看图书销售数据库 booksale 中名为 event_test3 的事件。
在图形化界面中由于列宽问题显示不全,可在命令行状态输入该命令并将“;”替换成“\G”结尾,结果将以垂直方向显示。
2. 修改事件
修改事件可以更改现有事件的各种属性,修改事件的基本语法格式如下所示。
语法说明如下。
RENAME TO 是重新为事件命名,new_event_name 是新的事件名称。若使用 db_name.event_name 指定事件所属数据库,则是将事件从一个数据库移动到另一个数据库中。
除上面关键字外,其他关键字和参数同创建事件的语法保持一致。
【例 9-30】修改图书销售数据库 booksale 中名为 event_test3 的事件,将其改名为 event_delete,时间频率改为 1 周,结束时间改为半年。
3. 禁用事件
临时关闭事件被称为禁用事件,禁用事件的基本语法格式如下所示。
语法说明:event_name 是禁用事件的名称。事件默认属于当前数据库,也可使用 db_name.event_name 禁用指定数据库中的事件。
【例 9-31】修改图书销售数据库 booksale 中名为 event_delete 的事件,将其临时关闭。
4. 启用事件
将禁用事件重新启用被称为启用事件,启用事件的基本语法格式如下所示。
语法说明:event_name 是启用事件的名称。事件默认属于当前数据库,也可使用 db_name.event_name 启用指定数据库中的事件。
【例 9-32】启用图书销售数据库 booksale 中名为 event_delete 的事件。
语法说明如下。
event_name 是删除事件的名称。默认删除的是当前数据库中的事件,也可使用 db_name.event_name 删除指定数据库中的事件。
IF EXISTS 是可选选项。添加该选项,表示指定的事件存在时执行删除事件操作,否则忽略此操作。
【例 9-33】删除图书销售数据库 booksale 中名为 event_delete 的事件。
版权声明: 本文为 InfoQ 作者【TiAmo】的原创文章。
原文链接:【http://xie.infoq.cn/article/a901e9ba7dc1daa44c563e936】。文章转载请联系作者。
评论