MySQL 8.4 Reference Manual  /  ...  /  Event Scheduler Configuration

27.4.2 事件调度器配置

事件由特殊的事件调度器线程执行;当我们提到事件调度器时,我们实际上是指这个线程。运行时,事件调度器线程及其当前状态可以通过拥有PROCESS特权在SHOW PROCESSLIST的输出中看到,正如以下讨论所示。

全局event_scheduler系统变量确定事件调度器是否启用并在服务器上运行。它有以下值,影响事件调度如所述:

  • ON: 事件调度器启动;事件调度器线程运行并执行所有预定的事件。ONevent_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_scheduler 设置为 OFF)时,可以通过将event_scheduler 的值设置为 ON 来启动它。(见下一个项目。)

  • DISABLED: 这个值使事件调度器失效。当事件调度器为 DISABLED 时,事件调度器线程不运行(因此不在SHOW PROCESSLIST 的输出中显示),此外,事件调度器状态不能在运行时更改。

如果事件调度器状态没有被设置为DISABLED,则可以使用event_scheduler将其切换到ONOFF(使用SET)。也可以使用0表示OFF,和1表示ON设置这个变量。因此,在mysql客户端中,可以使用以下4个语句来启用事件调度器:

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;
Note

如果启用了事件调度器,启用super_read_only系统变量将防止它在事件数据字典表中更新last executed时间戳。这使得事件调度器在下一次尝试执行计划事件时停止,写入服务器错误日志。 (在这种情况下,event_scheduler系统变量不会从ON切换到OFF。一个结果是,这个变量拒绝DBAintent,事件调度器的实际状态可能与启用或停止状态不同。如果后续super_read_only被禁用,服务器将自动重新启动事件调度器。

虽然ONOFF有数字等价值,但是event_schedulerSELECTSHOW VARIABLES显示的值总是OFFONDISABLEDDISABLED没有数字等价值。因此,通常情况下,设置这个变量时prefer使用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
Important

可以在服务器启动时设置Event Scheduler为DISABLED。如果event_schedulerONOFF,则不能在运行时设置为DISABLED。同样,如果服务器启动时Event Scheduler设置为DISABLED,则不能在运行时更改event_scheduler的值。

禁用事件调度器,可以使用以下两个方法:

  • 作为服务器启动时的命令行选项:

    --event-scheduler=DISABLED
  • 在服务器配置文件(my.cnf,或 Windows 系统中为 my.ini)中,包括可以被服务器读取的行(例如,在一个 [mysqld] 部分):

    event_scheduler=DISABLED

要启用事件调度器,重新启动服务器,不带--event-scheduler=DISABLED 命令行选项,或者在服务器配置文件中删除或注释掉包含event-scheduler=DISABLED 的行,或者根据需要。另外,您也可以在启动服务器时使用 ON(或 1)或 OFF(或 0)取代 DISABLED 值。

Note

event_scheduler 设置为 DISABLED 时,您可以发出事件操作语句。这样不会生成警告或错误(假设语句本身是有效的)。然而,直到将该变量设置为 ON(或 1),调度器事件不能执行。等到这时,事件调度线程将执行满足调度条件的所有事件。

使用--skip-grant-tables选项启动MySQL服务器,导致event_scheduler被设置为DISABLEDmy.cnfmy.ini文件中设置的任何其他值(BUG #26807)。

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

MySQL 在 INFORMATION_SCHEMA 数据库中提供了EVENTS 表,可以查询服务器上定义的事件信息。见第27.4.4节,“事件元数据”,和第28.3.14节,“INFORMATION_SCHEMA EVENTS 表”,获取更多信息。

关于事件调度和MySQL权限系统,请参见第27.4.6节,“事件调度器和 MySQL 权限”