MySQL基础21 — 事件调度器

概述

本章,您将学习 MySQL 中的事件调度器。

事件(event):由一组 SQL 语句集合组成,主要的作用是周期性运行数据库对象,用来实现 MySQL 的计划任务。事件通过事件调度器线程来执行,因此事件有时也被称为 "事件调度器(event scheduler)"。

众所周知,GNU/Linux 可通过 cron 程序的 crontab 命令来定义计划任务,该程序能识别的最小时间单位为 1 分钟。MySQL 中也有自己的计划任务,被称为事件,其能够识别的最小时间单位为 1 秒。

开启事件

在 MySQL 8.x 版本中默认开启事件,如下所示:

show session variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+
1 row in set (0.00 sec)

创建事件

创建事件的完整语法如下:

CREATE
    [DEFINER = user]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'string']
    DO event_body;

schedule: {
    AT timestamp [+ INTERVAL interval] ...
  | EVERY interval
    [STARTS timestamp [+ INTERVAL interval] ...]
    [ENDS timestamp [+ INTERVAL 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}

语法说明如下:

  • 一条 create event 语法可以创建一个事件

  • 每个事件由两部分组成:

    • 第一部分是事件调度(event schedule),表示事件何时启动以及启动的频率是什么
    • 第二部分是事件动作(event action),表示事件启动时的 SQL 语句
  • 事件的状态可以是活动的(打开的)或者停止的(关闭的)

  • [ ] 表示是可选的,{ } 表示必需的,| 表示需要选择其中的一个

  • DEFINER 表示使用哪个 MySQL 用户的权限来执行事件

  • event_name 表示自定义的事件名称

  • ON SCHEDULE schedule 表示具体的调度计划,可以是具体时间,也可以是间隔时间,时间的单位可以是年、季、月、天、小时、分钟、周、秒等等

  • ON COMPLETION [NOT] PRESERVE 表示事件执行完毕后是否要保存事件,默认不保存

  • ENABLE | DISABLE | DISABLE ON SLAVE 表示开启或关闭事件

  • COMMENT 'string' 表示事件的说明

  • DO event_body 表示事件的主体。DO 关键字后除了是单个 DQL、DML、DDL 之外,还可以是 begin...end 代码块包裹的多条 SQL 语句。若使用 begin...end 代码块,则需要在 create event 语句之前使用 delimiter 关键字预先定义分隔符(标记符)

示例的事件

通过下面的简单例子来学习下 MySQL 的事件。

示例一:立刻执行当前的事件

use world;

create event now_event_select 
on schedule at now()
enable
do select * from country;

now() 函数返回当前的日期与时间。

默认未保存该事件在 world 库中。

示例二:10 分钟之后执行事件

use world;

create event event_select_test
at current_timestamp() + interval 10 minute
enable
do select * from country;

current_timestamp() 函数等同于 now() 函数。

默认未保存该事件在 world 库中。

示例三:每秒执行一次

use world;

create event select_every_s
on schedule every 1 second
enable
do select * from country;

注意这里没有 at 关键字。

默认未保存该事件在 world 库中。

示例四:指定从特定的时间点开始,每秒执行一次

use world;

create event select_time_every
on schedule 
every 1 second
starts '2025-10-25 18:30:50'
enable
do select * from country;

默认未保存该事件在 world 库中。

示例五:从特定时间点开始定期执行并从特点时间点结束

use world;

create event starts_ends
on schedule
every 20 minute
starts now() + interval 10 day
ends now() + interval 1 month
on completion preserve 
enable
do call procedure_select();

说明:

  • 10 天之后的这个时间点开始事件,每 20 分钟执行一次,事件截止时间为 1 个月后的当前时间
  • 事件执行之后保存当前事件
  • 事件主体为调用存储过程

示例六:使用 begin...end 包裹多条 SQL

use world;

delimiter //

create event multi_sql
on schedule
every 20 minute
starts now() + interval 10 day
ends now() + interval 1 month
on completion preserve 
enable
do
begin
    ...;
    ...;
    ...;
end //

delimiter ;

begin...end 中还可以嵌套 begin...end

保存事件后的操作

默认情况下事件并不保存在库中,但若保存了相关事件,则可以进行相关操作:

# 关闭特定事件
alter event 事件名 disable; 

# 启用特定事件
alter event 事件名 enable;

# 查看特定库中的事件
show events from 库名;

# 查看事件的创建语句
show create event 事件名;

# 删除事件
drop event 事件名;
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇