事件由一个特殊的事件调度程序线程执行;当我们提到事件调度程序时,我们实际上指的是这个线程。当运行时,事件调度程序线程及其当前状态可以通过具有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 权限”。