MySQL事件和事件调度程序指南介绍
MySQL 事件是根据
用户定义的计划运行的任务。事件调度器是一个特殊的线程,它在预定的时间执行事件。
MySQL 事件很有用,因为它们有助于数据库管理和定期数据库操作任务。
在本教程中,你将了解什么是 MySQL 事件以及如何设置和使用它们,包括一些MySQL事件和事件调度使用示例。
先决条件:
- 在数据库服务器上运行 MySQL 的系统
- 具有 root 权限的 MySQL 用户帐户
什么是 MySQL 事件调度程序?
MySQL Event Scheduler 是一个在后台运行并管理调度事件执行的线程。除非全局变量
event_scheduler
设置为
ON
或 ,否则调度程序处于睡眠状态
1
。
MySQL Event Scheduler 代表 MySQL
对 Cron job的
替代。事件调度程序的一些好处是:
- 它直接写在 MySQL 服务器上。
- 它独立于平台和应用程序。
- 只要需要定期更新或清理数据库,就可以使用它。
- 它减少了查询编译的数量。
注意:在我们的教程中了解有关cron 作业以及如何设置它们的更多信息。
MySQL如何使用事件和事件调度?下面我们结合对应的例子一一解析:
MySQL 事件调度程序配置
MySQL事件和事件调度程序指南:MySQL Event Scheduler 状态可以配置为将 Scheduler 设置为
on、
off或
禁用它。
要检查事件调度程序状态,请运行以下命令:
SHOW processlist;
MySQL事件和事件调度使用示例:
event_scheduler
结果中显示的系统变量表示事件调度的状态。这里,
event_scheduler
变量 state 是
Waiting on empty queue,这意味着 Scheduler 处于开启状态并等待事件触发它。
可能的状态是:
ON
:事件调度程序线程正在运行并执行所有调度的事件。这是调度程序的默认状态。如果调度程序是ON
,则SHOW processlist
命令输出将其列为守护进程。
要打开 Event Scheduler
ON
,请运行以下命令:
SET GLOBAL event_scheduler = ON;
该值
ON
可与 互换
1
。
OFF
:事件调度程序线程没有运行,它没有出现在SHOW processlist
. 如果 Event Scheduler 设置为OFF
,则不会执行计划的事件。
要打开 Event Scheduler
OFF
,请运行以下命令:
SET GLOBAL event_scheduler = OFF;
该值
OFF
可与 互换
0
。
DISABLED
:此状态表示事件调度程序无法运行。该线程不会运行,也不会显示在SHOW processlist
命令的输出中。
要禁用事件调度程序,请在启动服务器时添加以下命令行选项:
--event-scheduler=DISABLED
注意:事件调度程序只能在服务器启动时禁用,如果其状态设置为
ON
或,则不能在运行时禁用
OFF
。
event_scheduler
如果 Event Scheduler
DISABLED
在启动时设置为,则无法在运行时更改的值。
MySQL 事件调度
事件是包含在指定时间或定期执行的 SQL 语句的数据库对象。事件在特定的时间和日期开始和结束。
由于 MySQL 事件在用户指定的时间执行,因此这些事件也称为
时间 触发器。但是,它们不应与MySQL Triggers混淆,后者是为响应特定事件而执行的数据库对象。因此,在提及计划任务时最好使用术语
事件以避免混淆。
以下部分讨论如何
创建、
显示、
更改或
删除事件。
创建新事件
MySQL如何使用事件和事件调度?要创建新事件,请使用以下语法:
CREATE EVENT [IF NOT EXIST] event_name
ON SCHEDULE schedule
DO
event_body
MySQL事件和事件调度使用示例:该
IF NOT EXIST
语句确保事件名称对于正在使用的数据库是唯一的。指定唯一的事件名称来代替
event_name
语法。执行事件的时间表在
ON SCHEDULE
语句之后指定。事件可以是
一次性事件或
重复事件。
输入 SQL 语句代替关键字
event_body
后的语法
DO
。事件主体可以包含存储过程、单个查询或复合语句。在
BEGIN END
块内编写复合语句。
安排事件
MySQL事件和事件调度程序指南:事件可以安排为稍后执行或定期执行。
一次性事件
一次性事件只执行一次,然后自动删除。
要创建一次性事件,请
ON SCHEDULE
使用以下语法在语句后指定时间戳:
AT timestamp + [INTERVAL interval]
间隔的可能选择是:
- YEAR
- QUARTER
- MONTH
- DAY
- HOUR
- MINUTE
- WEEK
- SECOND
- YEAR_MONTH
- DAY_HOUR
- DAY_MINUTE
- DAY_SECOND
- HOUR_MINUTE
- HOUR_SECOND
- MINUTE_SECOND
时间戳必须是未来的
DATETIME
或
TIMESTAMP
值。要指定确切时间,请使用
+ INTERVAL
、正整数和间隔选项之一向时间戳添加间隔。请注意,这仅适用于使用该
CURRENT_TIMESTAMP
功能时。
例如:
在这里,事件在创建两天后发生,任务是删除名为
test的表。
事件在执行后自动删除。如果要将事件保存在数据库中,请
ON COMPLETION PRESERVE
在创建事件时添加子句。
重复事件
MySQL事件和事件调度使用示例:重复发生的事件在指定的时间重复发生。要安排重复事件,请在
ON SCHEDULE
语句后使用以下语法:
EVERY interval
STARTS timestamp [+ INTERVAL]
ENDS timestamp [+ INTERVAL]
该
STARTS
事件何时开始执行,而关键字指定
ENDS
关键字指定事件何时停止执行。
例如:
此事件导致 MySQL 每六个月删除一次 table test,立即开始。
你还可以指定一个间隔以稍后开始事件。例如:
你还可以指定事件的开始时间和结束时间:
此事件使 MySQL从现在开始每六个月删除一次名为
test的表,持续五年,从现在开始五天。
显示事件
MySQL事件和事件调度程序指南:以下命令显示存储在数据库中的所有事件:
SHOW EVENTS FROM database_name;
请注意,一次性事件在执行后会自动删除,并且不会出现在
SHOW EVENTS
命令的输出中,除非你
ON COMPLETION PRESERVE
在创建事件时使用该子句。
输出列出了存储在指定数据库中的所有事件。
更改事件
MySQL如何使用事件和事件调度?使用
ALTER EVENT
语句更改现有事件:
ALTER EVENT event_name
[ ON SCHEDULE schedule ]
[ RENAME TO new_event_name ]
[ ON COMPLETION [ NOT ] PRESERVE ]
[ COMMENT 'comment' ]
[ ENABLED | DISABLED ]
[ DO sql_statement ]
的
event_name
必须是已存在的事件。后面的所有语句
ALTER EVENT
都是可选的,具体取决于你要更改的内容。省略
ALTER EVENT
命令中的任何子句意味着它们保持以前的状态。任何包含的子句都意味着应用你指定的新值。
例如:
在本例中,我们重命名了事件并更改了其 SQL 语句。
删除事件(丢弃事件)
MySQL事件和事件调度使用示例:要删除(删除)事件,请使用以下语法:.
DROP EVENT [IF EXISTS] event_name;
例如:
此操作
会从数据库中
永久删除事件。
IF EXISTS
如果此类事件不存在,则使用该语句会发出警告:
MySQL事件和事件调度程序指南:MySQL 事件限制
使用 MySQL 事件时需要考虑某些限制。他们之中有一些是:
- 事件不能返回结果集。输出被定向到 dev/null,事件要么失败要么成功,而不通知用户。
- 事件名称不区分大小写。两个事件不能同名但大小写不同。
- 事件不能安排在2038 年1 月 19日之后 - Unix 纪元中可以表示的最大值。
- 另一个存储的程序、触发器或事件不能创建、删除或更改事件。
- 事件不能创建、删除或更改存储的程序或触发器。
- 间隔
MONTH
、YEAR_MONTH
、QUARTER
和YEAR
以月为单位解析。所有其他时间间隔都以秒为单位解决。
- 可以有两个具有相同调度的事件,但无法强制执行顺序。
- 事件始终以定义者权限运行。线程以创建事件的用户身份执行事件,并具有该用户的权限。请注意,删除用户不会删除用户创建的事件。
- 事件不会改变语句的执行次数,这意味着对
SHOW STATISTICS
命令没有影响。
- 执行事件的最大延迟为两秒。但是,information_schema.events表始终显示事件执行的准确时间。
- 使用用户定义的变量,而不是在存储例程内的预准备语句中引用局部变量。
- 递归调用的次数限制为
max_sp_recursion_depth
。如果此变量为 0(默认值),则禁用递归。
- 使用
START TRANSACTION
语句代替BEGIN WORK
, 因为BEGIN WORK
被视为BEGIN END
块的开始。
- 存储过程的任何其他限制也适用于事件。
结论
MySQL如何使用事件和事件调度?现在你知道如何使用 MySQL Events 来自动化数据库管理。随意尝试不同的语句以查看它们如何影响事件并将它们与其他 MySQL 功能(例如存储过程)结合起来。