概述
本章,您将学习 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 事件名;










