### 25.4.2 事件调度程序配置

事件由一个特殊的事件调度线程执行；当我们提到 Event Scheduler 时，我们实际上指的是这个线程。运行时，事件调度线程及其当前状态可以被拥有[`过程`](privileges-provided.html#priv_process)在输出的特权[`显示进程列表`](show-processlist.html)，如以下讨论所示。

[](<>)[](<>)

全球[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)系统变量确定事件调度程序是否已启用并在服务器上运行。它具有以下值之一，这些值会影响所描述的事件调度：

-   `在`：事件调度器启动；事件调度程序线程运行并执行所有已调度的事件。`在`是默认的[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)价值。

    [](<>)

    当事件调度器是`在`，事件调度程序线程在输出中列出[`显示进程列表`](show-processlist.html)作为守护进程，其状态表示如下所示：

    ```
    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`](server-system-variables.html#sysvar_event_scheduler)到`离开`.

-   `离开`：事件调度程序已停止。事件调度程序线程未运行，未显示在输出中[`显示进程列表`](show-processlist.html)，并且没有计划的事件执行。

    当事件调度程序停止时（[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)是`离开`)，它可以通过设置值来启动[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)到`在`.（见下一项。）

-   `已禁用`：此值使事件调度程序无法运行。当事件调度器是`已禁用`，事件调度程序线程不会运行（因此不会出现在[`显示进程列表`](show-processlist.html)）。此外，Event Scheduler 状态不能在运行时更改。

    如果 Event Scheduler 状态尚未设置为`已禁用`,[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)可以在之间切换`在`和`离开`（使用[`放`](set-variable.html)）。也可以使用`0`为了`离开`， 和`1`为了`在`设置此变量时。因此，以下 4 个语句中的任何一个都可以用于[**mysql**](mysql.html)客户端打开事件调度程序：


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

同样，这 4 条语句中的任何一条都可用于关闭 Event Scheduler：

```
SET GLOBAL event_scheduler = OFF;
SET @@GLOBAL.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@GLOBAL.event_scheduler = 0;
```

笔记

如果启用了事件调度程序，则启用[`super_read_only`](server-system-variables.html#sysvar_super_read_only)系统变量阻止它更新事件“最后执行”的时间戳`事件`数据字典表。这会导致事件调度程序在下一次尝试执行调度的事件时停止，在将消息写入服务器错误日志之后。（在这种情况下[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)系统变量不会从`在`到`离开`.一个暗示是这个变量反映了 DBA*意图*启用或禁用事件调度程序，其中启动或停止的实际状态可能不同。）。如果[`super_read_only`](server-system-variables.html#sysvar_super_read_only)在启用后随后被禁用，服务器会根据需要自动重新启动事件调度程序，从 MySQL 8.0.26 开始。在 MySQL 8.0.26 之前，需要通过再次启用来手动重启 Event Scheduler。

虽然`在`和`离开`有数字等价物，显示的值[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)经过[`选择`](select.html)要么[`显示变量`](show-variables.html)总是其中之一`离开`,`在`， 要么`已禁用`.*`已禁用`没有数字等价物*.为此原因，`在`和`离开`通常优先于`1`和`0`设置此变量时。

请注意，试图设置[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)不将其指定为全局变量会导致错误：

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

重要的

可以将事件调度程序设置为`已禁用`仅在服务器启动时。如果[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)是`在`要么`离开`，您不能将其设置为`已禁用`在运行时。此外，如果事件调度程序设置为`已禁用`在启动时，您无法更改[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)在运行时。

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

-   作为启动服务器时的命令行选项：

    ```
    --event-scheduler=DISABLED
    ```

-   在服务器配置文件中（`我的.cnf`， 要么`我的.ini`在 Windows 系统上），包括服务器可以读取的行（例如，在`[mysqld]`部分）：

    ```
    event_scheduler=DISABLED
    ```

    要启用事件调度程序，请重新启动服务器而不使用[`--event-scheduler=禁用`](server-system-variables.html#sysvar_event_scheduler)命令行选项，或者在删除或注释掉包含的行之后[`事件调度程序=禁用`](server-system-variables.html#sysvar_event_scheduler)在服务器配置文件中，视情况而定。或者，您可以使用`在`（要么`1`） 要么`离开`（要么`0`) 代替`已禁用`启动服务器时的值。

笔记

您可以在以下情况下发出事件操作语句[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)被设定为`已禁用`.在这种情况下不会产生警告或错误（前提是这些语句本身是有效的）。但是，在此变量设置为之前，计划的事件无法执行`在`（要么`1`）。完成此操作后，事件调度程序线程将执行满足调度条件的所有事件。

使用以下命令启动 MySQL 服务器[`--skip-grant-tables`](server-options.html#option_mysqld_skip-grant-tables)选项原因[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)设置为`已禁用`，覆盖在命令行或在`我的.cnf`要么`我的.ini`文件（错误＃26807）。

有关用于创建、更改和删除事件的 SQL 语句，请参阅[第 25.4.3 节，“事件语法”](events-syntax.html).

MySQL 提供了一个[`活动`](information-schema-events-table.html)表中的`INFORMATION_SCHEMA`数据库。可以查询此表以获取有关已在服务器上定义的计划事件的信息。看[第 25.4.4 节，“事件元数据”](events-metadata.html)， 和[第 26.3.14 节，“信息\_SCHEMA 事件表”](information-schema-events-table.html)， 了解更多信息。

有关事件调度​​和 MySQL 特权系统的信息，请参阅[第 25.4.6 节，“事件调度程序和 MySQL 权限”](events-privileges.html).
