Navicat 博客

2018 年 6 月 26 日,由 Robert Gravelle 撰写

简单来说,事件(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)
Navicat 文章
频道条目
分享
文章归档