MySQL 8.4 参考手册  /  ...  /  事件调度程序配置

27.4.2 事件调度程序配置

事件由一个特殊的 事件调度程序线程 执行;当我们提到事件调度程序时,实际上指的是这个线程。在运行时,事件调度程序线程及其当前状态可以被拥有 PROCESS 权限的用户在 SHOW PROCESSLIST 的输出中看到,如下文所述。

全局 event_scheduler 系统变量决定事件调度程序是否在服务器上启用并运行。它具有以下值之一,它们对事件调度产生的影响如下所述

  • ON:事件调度程序已启动;事件调度程序线程正在运行并执行所有已安排的事件。 ON 是默认的 event_scheduler 值。

    当事件调度程序为 ON 时,事件调度程序线程在 SHOW PROCESSLIST 的输出中被列为一个守护进程,其状态表示如下

    mysql> SHOW PROCESSLIST\G
    *************************** 1. row ***************************
         Id: 1
       User: root
       Host: localhost
         db: NULL
    Command: Query
       Time: 0
      State: NULL
       Info: show processlist
    *************************** 2. row ***************************
         Id: 2
       User: event_scheduler
       Host: localhost
         db: NULL
    Command: Daemon
       Time: 3
      State: Waiting for next activation
       Info: NULL
    2 rows in set (0.00 sec)

    事件调度可以通过将 event_scheduler 的值设置为 OFF 来停止。

  • OFF:事件调度程序已停止。事件调度程序线程不会运行,也不会显示在 SHOW PROCESSLIST 的输出中,并且不会执行任何已安排的事件。

    当事件调度程序停止时(event_schedulerOFF),可以通过将 event_scheduler 的值设置为 ON 来启动它。(参见下一项。)

  • DISABLED:此值使事件调度程序无法正常运行。当事件调度程序为 DISABLED 时,事件调度程序线程不会运行(因此不会出现在 SHOW PROCESSLIST 的输出中)。此外,事件调度程序状态无法在运行时更改。

如果事件调度程序状态尚未设置为 DISABLEDevent_scheduler 可以使用 SETONOFF 之间切换。在设置此变量时,也可以使用 0 代替 OFF,使用 1 代替 ON。因此,以下 4 个语句中的任何一个都可以在 mysql 客户端中使用,以打开事件调度程序

SET GLOBAL event_scheduler = ON;
SET @@GLOBAL.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@GLOBAL.event_scheduler = 1;

同样,以下 4 个语句中的任何一个都可以用来关闭事件调度程序

SET GLOBAL event_scheduler = OFF;
SET @@GLOBAL.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@GLOBAL.event_scheduler = 0;
注意

如果事件调度程序已启用,启用 super_read_only 系统变量将阻止它更新事件 上次执行 时间戳在 events 数据字典表中。这会导致事件调度程序在下一次尝试执行已安排的事件时停止,并在服务器错误日志中写入一条消息。(在这种情况下,event_scheduler 系统变量不会从 ON 更改为 OFF。这意味着此变量拒绝 DBA 意图 启用或禁用事件调度程序,而其实际启动或停止状态可能有所不同。)如果 super_read_only 在启用后被禁用,服务器会自动根据需要重新启动事件调度程序。

虽然 ONOFF 有数字等价物,但 SELECTSHOW VARIABLES 显示的 event_scheduler 的值始终是 OFFONDISABLED 之一。 DISABLED 没有数字等价物。因此,在设置此变量时,通常建议使用 ONOFF,而不是 10

请注意,尝试设置 event_scheduler 而没有将其指定为全局变量会导致错误

mysql< SET @@event_scheduler = OFF;
ERROR 1229 (HY000): Variable 'event_scheduler' is a GLOBAL
variable and should be set with SET GLOBAL
重要

只能在服务器启动时将事件调度程序设置为 DISABLED。如果 event_schedulerONOFF,则无法在运行时将其设置为 DISABLED。此外,如果事件调度程序在启动时设置为 DISABLED,则无法在运行时更改 event_scheduler 的值。

要禁用事件调度程序,请使用以下两种方法之一

  • 在启动服务器时,作为命令行选项

    --event-scheduler=DISABLED
  • 在服务器配置文件(Windows 系统上的 my.cnfmy.ini)中,包含该行,以便服务器可以读取它(例如,在 [mysqld] 部分中)

    event_scheduler=DISABLED

要启用事件调度程序,请在没有 --event-scheduler=DISABLED 命令行选项的情况下重新启动服务器,或者在服务器配置文件中删除或注释掉包含 event-scheduler=DISABLED 的行,具体取决于情况。或者,您可以在启动服务器时使用 ON(或 1)或 OFF(或 0)来代替 DISABLED 值。

注意

您可以在 event_scheduler 设置为 DISABLED 时发出事件操作语句。在这种情况下不会生成警告或错误(前提是语句本身有效)。但是,已安排的事件无法执行,直到此变量设置为 ON(或 1)。完成此操作后,事件调度程序线程将执行所有调度条件满足的事件。

使用 --skip-grant-tables 选项启动 MySQL 服务器会导致 event_scheduler 设置为 DISABLED,覆盖在命令行或 my.cnfmy.ini 文件中设置的任何其他值(错误 #26807)。

有关用于创建、更改和删除事件的 SQL 语句,请参见 第 27.4.3 节,“事件语法”

MySQL 在 INFORMATION_SCHEMA 数据库中提供了一个 EVENTS 表。可以查询此表以获取有关在服务器上定义的已安排事件的信息。有关更多信息,请参见 第 27.4.4 节,“事件元数据”第 28.3.14 节,“INFORMATION_SCHEMA EVENTS 表”

有关事件调度和 MySQL 权限系统的更多信息,请参见 第 27.4.6 节,“事件调度程序和 MySQL 权限”