avatar

mysql事件

mysql事件

事件是什么

MySQL5.1版本开始引进event概念,MySQL
中的事件(event:时间触发器)是用于执行定时或周期性的任务,类似Linux中的crontab,但是后者只能精确到分钟,事件可以精确到秒。通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程。事件由一个特定的线程来管理的,也就是所谓的事件调度器,但是事件不能直接调用。

事件的优缺点

优点

一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。
可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。

缺点

定时触发,不可以调用。

创建事件

一条create event语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件调度(event
schedule),表示事件何时启动以及按什么频率启动,第二部分是事件动作(event action
),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者benin…end语句块,这两种情况允许我们执行多条SQL。

一个事件可以是活动(打开)的或停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中,但调度器不会检查它是否应该调用。在一个事件创建之后,它立即变为活动的,一个活动的事件可以执行一次或者多次。

创建事件的语法

CREATE

[DEFINER = { user | CURRENT_USER }] //定义事件执行的时候检查权限的用户

EVENT

[IF NOT EXISTS]

event_name

ON SCHEDULE schedule //定义执行的时间和时间间隔。

[ON COMPLETION [NOT] PRESERVE] //定义事件是一次执行还是永久执行,默认为一次执行,即NOT PRESERVE。

[ENABLE | DISABLE | DISABLE ON SLAVE] // 定义事件创建以后是开启还是关闭,以及在从上关闭。如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE。

[COMMENT 'comment'] //定义事件的注释。

DO sql_statement; //事件的主题,执行语句

事件语法的相关解释:

  • event_name:事件是模式对象,与表、存储过程和触发器一样。 event_name 必须是有效的标识符,且可以按正常方式通过模式名称进行引用和 / 或限定。事件名称在模式中必须是唯一的。
  • schedule :调度表是一种规则,用于指定 MySQL 执行与事件相关联的操作的时间
  • sql_statement :您必须包含按调度表执行的有效 SQL 语句或存储过程语句。此语句受到的限制与适用于存储函数和动态 SQL 的限制相同。例如,该语句无法返回结果集(如 SELECT 或 SHOW 所生成的结果集)。通常会使用 CALL 语句调用过程来执行实际操作。

schedule

调度表是指定应在何时执行操作的规则。可以在 CREATE EVENT 和 ALTER EVENT 语句的 SCHEDULE 子句中指定调度表。
有两种类型的调度表:执行一次的调度表(使用 AT 关键字)和可重复执行的调度表(使用 EVERY 关键字)。对于后者,必须定义事件的重复频率。还可以定义一个时间段,以确定应重复执行事件的期限。
SCHEDULE 子句的语法如下所示:

AT timestamp [+ INTERVAL interval]| EVERY interval [STARTS timestamp [+ INTERVAL interval]] [ENDS timestamp [+ INTERVAL interval]]

SCHEDULE 子句可包含以下变量元素:
timestamp : DATETIME 或 TIMESTAMP 类型的表达式;
interval :用于指定持续时间。持续时间的表示方法为,指定一个整数数量,后跟用于定义特定种类持续时间的关键字。有效的关键字包括:

  • YEAR,QUARTER, MONTH, DAY, HOUR, MINUTE, WEEK, SECOND, YEAR_MONTH, DAY_HOUR, DAY_MINUTE, DAY_SECOND, HOUR_MINUTE, HOUR_SECOND, MINUTE_SECOND

事件调度程序是 mysqld 进程中的一个单独线程,负责执行调度事件。调度程序会检查是否应执行事件;如果应执行事件,则会创建新的连接来执行操作。
使用事件来自动地定期执行(维护)任务,如更新汇总表或刷新查询中的表(物化视图 仿真),或者执行夜间作业。例如,处理白天的工作、加载数据仓库或者将数据导出到 文件中。

启用事件调度程序

创建事件后,该事件将存储在数据库中,以便按调度表执行。 event_scheduler线程会监控所有事件的调度表,在到达调度表中的时间时,该线程会启动一个新的线程来执行每个事件。

默认情况下, event_scheduler 线程设置为 OFF 。您必须显式启用该线程,方法为修改全局 event_scheduler服务器变量的值,将其设置为 ON。

查看event功能是否开启
show variables like 'event%';
set global event_scheduler = ON; //将event功能开启

创建事件的例子

delimiter &&
DROP EVENT if EXISTS direct_happen; //如果存在改事件则删除
CREATE EVENT direct_happen //创建事件
on SCHEDULE AT NOW() //事件发生的时刻,这里是立即发生
DO
BEGIN
delete from test wehre id='1' ; //删除teat表id为1的数据
end &&
Delimiter;

查看事件

查看当前所在库的事件:

show events;

启用和禁用

alter event event_name disable; //event_name事件的名称
alter event event_name enable;

删除事件

drop event [if exists] event_name

又一个例子

delimiter $$
create event insert_currenttime_in_table1 //insert_currenttime_in_table1事件名
on schedule every 5 second // 每隔5秒中就向 `table1` 插入当前时间
on completion preserve //当event到期了,event会被disable,但是该event还是会存在
//当为on completion not preserve的时候,当event到期的时候,该event会被自动删除掉.
enable //定义事件创建以后是开启还是关闭 disable是关闭
comment '每隔5秒中就向 `table1` 插入当前时间的事件' //定义事件的注释
do
begin
insert into `table1` values(null, now()); //事件执行的执行语句
end$$
delimiter ;

写事件时建议模仿上面这个例子

文章作者: Todcsw
文章链接: https://todcsw.github.io/2020/05/12/mysql-mysql-event/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 行路のblog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论