简单来说,事件(event)是可以根据计划运行的任何任务。许多流行的 DBMS 都包含对事件的支持。这些也称为“计划的事件”或“临时触发器”,因为事件是由时间触发的,而不是由数据库操作(如表更新)调用的触发器。数据库事件可用于各种任务,例如优化数据库表、清理日志、对数据进行归档或在非高峰时间生成报表。
在本篇文章中,我们将学习如何查看和激活数据库事件。在随后的文章中,我们将学习如何为各种任务配置事件。
事件与计划任务
虽然数据库事件类似于 UNIX 中的 cron 作业或 Windows 任务计划程序,但它们的不同之处在于,事件在数据库级别进行管理和调用,而不是操作系统(OS)。因此,数据库事件是使用数据库的数据定义语言(DDL)配置,而 cron 作业和计划任务是使用该操作系统的特定命令和/或工具定义。
配置 Event Scheduler(事件调度程序)线程
事件由特殊线程执行。如果你具有 PROCESS 权限,则可以在 mysql> 提示符下键入“SHOW PROCESSLIST”命令来查看事件调度程序线程及其当前的状态:
mysql> SHOW PROCESSLIST; +----+-----------------+-----------------+--------+---------+------+-----------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+-----------------+--------+---------+------+-----------------------------+------------------+ | 2 | event_scheduler | localhost:49670 | NULL | Daemon | 3 | Waiting for next activation | | | 3 | root | localhost:49671 | NULL | Sleep | 43 | | NULL | | 4 | root | localhost:49672 | NULL | Sleep | 180 | | NULL | | 5 | root | localhost:56134 | sakila | Query | 0 | starting | SHOW PROCESSLIST | | 6 | root | localhost:56136 | sakila | Sleep | 1025 | | NULL | +----+-----------------+-----------------+--------+---------+------+-----------------------------+------------------+ 5 rows in set (0.01 sec)
激活事件调度程序
事件调度程序的激活和启用都是通过全局 event_scheduler 系统变量完成的。你可以为其分配以下三个值中的一个:
- ON: 这启动了事件调度程序。事件调度程序线程运行并执行所有计划的事件。这是默认值。
当事件调度程序为 ON 时,事件调度程序线程在 SHOW PROCESSLIST 的输出中列为守护(daemon)进程,其状态表示为“Waiting for next activation”(等待下一次激活),如上面的输出所示。
“ON”或其等效数字 1 都是可接受的值。因此,你可以在 mysql 客户端中使用以下 4 个语句中的任何一个来打开事件调度程序:
- SET GLOBAL event_scheduler = ON;
- SET @@global.event_scheduler = ON;
- SET GLOBAL event_scheduler = 1;
- SET @@global.event_scheduler = 1;
- OFF: 停止事件调度程序。事件调度程序线程未运行,未显示在 SHOW PROCESSLIST 的输出中,并且未执行任何任何计划的事件。
当 event_scheduler 变量设置为 OFF(事件调度程序停止)时,可以通过将 event_scheduler 的值设置为 ON 来(重新)启动它。
你也可以使用 0 代替“OFF”,这 4 个语句中的任何一个都可用于关闭事件调度程序:
- SET GLOBAL event_scheduler = OFF;
- SET @@global.event_scheduler = OFF;
- SET GLOBAL event_scheduler = 0;
- SET @@global.event_scheduler = 0;
- DISABLED: 此值将事件调度程序线程置于休眠状态,事件调度程序无法操作。此外,当事件调度程序为 DISABLED 时,事件调度程序线程不会出现在 SHOW PROCESSLIST 的输出中。
请注意,事件计划程序已禁用时,无法在运行时更改其状态。
显示 event_scheduler 值
虽然 ON 和 OFF 具有等效数字,但 DISABLED 没有。因此,SELECT 或 SHOW VARIABLES 生成的 event_scheduler 值始终使用完整文本显示,即“OFF”、“ON”或“DISABLED”。因此,在设置 event_scheduler 变量时,建议优先使用“ON”和“OFF”而不是 1 和 0。
mysql> SHOW VARIABLES like 'event_%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | OFF | +-----------------+-------+ 1 row in set (0.02 sec)