事件由一个特殊的事件调度程序线程执行;当我们提到事件调度程序时,我们实际上指的是这个线程。当运行时,事件调度程序线程及其当前状态可以通过具有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_scheduler
为OFF
),可以通过将event_scheduler
的值设置为ON
来启动它。(参见下一项。)DISABLED
:此值使事件调度程序无法运行。当事件调度程序为DISABLED
时,事件调度程序线程不会运行(因此不会出现在SHOW PROCESSLIST
的输出中)。此外,事件调度程序状态不能在运行时更改。
如果事件调度程序状态尚未设置为DISABLED
,则可以将event_scheduler
在ON
和OFF
之间切换(使用SET
)。在设置此变量时,也可以使用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
之后将其禁用,服务器会自动重新启动事件调度程序,具体取决于需要。
尽管ON
和OFF
有数值等效项,但event_scheduler
由SELECT
或SHOW VARIABLES
显示的值始终是OFF
、ON
或DISABLED
之一。DISABLED
没有数值等效项。因此,在设置此变量时,通常建议使用ON
和OFF
,而不是1
和0
。
请注意,尝试设置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_scheduler
为ON
或OFF
,则不能在运行时将其设置为DISABLED
。同样,如果在启动时将事件调度程序设置为DISABLED
,则不能在运行时更改event_scheduler
的值。
要禁用事件调度程序,请使用以下两种方法之一
在启动服务器时作为命令行选项
--event-scheduler=DISABLED
在服务器配置文件(在 Windows 系统上为
my.cnf
或my.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.cnf
或my.ini
文件中设置的任何其他值(错误 #26807)。
有关用于创建、更改和删除事件的 SQL 语句,请参见第 27.5.3 节“事件语法”。
MySQL 在INFORMATION_SCHEMA
数据库中提供了一个EVENTS
表。可以查询此表以获取有关在服务器上定义的计划事件的信息。有关更多信息,请参见第 27.5.4 节“事件元数据” 和第 28.3.14 节“INFORMATION_SCHEMA EVENTS 表”。
有关事件调度和 MySQL 权限系统的详细信息,请参阅 第 27.5.6 节“事件调度程序和 MySQL 权限”。