MySQL事件调度程序管理事件的调度和执行,也就是根据计划运行的任务
MySQL事件是根据计划运行的任务
创建事件时,将创建一个包含一个或多个SQL语句的命名数据库对象,该SQL语句将在一个特定的日期和时间开始和结束,并以一个或多个规则的时间间隔执行
事件是使用其定义者的特权执行的,并且它不能执行其定义者没有特权的任何操作
执行CREATE EVENT或ALTER EVENT语句时当前的会话时区用于解释事件定义中指定的时间。这就是事件时区(ETZ);也就是说,用于事件调度的时区,在事件执行时有效。
主要功能和属性
在MySQL中,事件是通过事件的名称和为其分配的架构唯一标识的
事件根据时间表执行特定操作。该操作由一个SQL语句组成,可以使用复合语句BEGIN ... END。事件可以是一次性的时间或反复发作。一次性事件仅执行一次。重复事件以固定的时间间隔重复其操作,并且可以为重复事件的时间表指定特定的开始日期和时间,结束日期和时间,或者两者都指定,也可以不指定。(默认情况下,重复事件的日程安排从创建之日起开始,并无限期地持续,直到被禁用或删除为止。)如果重复事件未在其调度间隔内终止,则结果可能是事件的多个实例同时执行。如果不希望这样做,则应建立一种机制来防止同时发生实例。例如,您可以使用 GET_LOCK()函数,或行或表锁定。
用户可以使用用于这些目的的SQL语句创建,修改和删除计划的事件。语法上无效的事件创建和修改语句失败,并显示相应的错误消息。用户可以在事件的动作中包含要求用户实际上没有特权的语句。事件创建或修改语句成功,但是事件的操作失败。
可以使用SQL语句设置或修改事件的许多属性。这些属性包括事件的名称,时间,持续性(即,是否在其计划到期后保留),状态(启用或禁用),要执行的操作以及为其分配的架构。事件的默认定义者是创建事件的用户,除非事件发生了改变,在这种情况下,定义者是发出最后一条影响该事件的ALTER EVENT语句的用户。在为事件定义了事件的数据库上,任何拥有EVENTt权限的用户都可以修改事件。
事件的动作语句可能包含存储例程中允许的大多数SQL语句
权限
EVENT权限
事件中语句需要的权限
配置
事件由特殊的事件调度程序线程执行;当我们引用事件调度程序时,实际上是指该线程。在运行时,事件调度程序线程及其当前状态可以由具有PROCESS输出特权的用户使用SHOW PROCESSLIST看到
event_scheduler:确定事件调度程序是否已启用并在服务器上运行。
OFF:默认值,停止事件计划程序。不运行事件调度程序线程并且不执行任何调度事件。当事件调度停止。SHOW PROCESSLIST不会显示
ON:启动事件调度程序;运行事件调度程序线程并执行所有调度事件。SHOW PROCESSLIST会显示
DISABLED:此值使事件计划程序无法运行。事件调度程序线程将不会运行。此外,事件调度程序状态不能在运行时更改。SHOW PROCESSLIST不会显示
事件元数据
SELECT * FROM mysql.event;
SELECT * FROM INFORMATION_SCHEMA.EVENTS;
SHOW CREATE EVENT
SHOW EVENTS [{FROM | IN} schema_name] [LIKE 'pattern' | WHERE expr]
运行mysqladmin debug获取有关事件计划程序状态的信息以进行调试和故障排除.运行此命令后,服务器的错误日志包含与事件计划程序有关的输出,诊断消息(不仅错误,而且警告)被写入错误日志,并在Windows上写入应用程序事件日志
命令
创建事件
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
DO event_body;
schedule: {
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
}
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
DEFINER:指定在事件执行时检查访问权限时要使用的MySQL帐户。如果指定DEFINER子句,该user值应被指定为一个MySQL帐户,默认为创建用户
ON SCHEDULE:用于确定事件的执行时间和频率
- AT timestamp:用于一次性事件,指定事件仅在所给定的日期和时间执行一次,timestamp必须同时包括日期和时间,或者必须是可解析为datetime值的表达式。如果日期是过去的日期,则会出现警告。+ INTERVAL INTERVAL子句指定timestamp之后的某个事件,遵循时间间隔中描述的语法规则,但不能使用涉及微秒的任何单位关键字,可以指定多个
- EVERY:定期重复操作(EVERY 6 WEEK),可选子句STARTS timestamp [+ INTERVAL interval]指定事件开始执行的时间和ENDS timestamp [+ INTERVAL interval]指定事件结束时间
DO:包含由事件执行的SQL语句
ON COMPLETION PRESERVE:通常,一旦事件过期,它将立即被丢弃。使用此语句覆盖此行为
ON COMPLETION NOT PRESERVE:显式显示默认的非持久行为
ENABLE:创建事件,并使其处于活动状态
DISABLE:创建事件,并使其处于禁用状态
DISABLE ON SLAVE:为副本上的事件设置状态,以指示该事件已在源上创建并复制到副本,但未在副本上执行;通常, DISABLE ON SLAVE会根据需要自动设置
CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAY
DO
UPDATE myschema.mytable SET mycol = mycol + 1;
CREATE EVENT e_totals
ON SCHEDULE AT '2006-02-10 23:59:00'
DO
INSERT INTO test.totals VALUES (NOW());
CREATE EVENT e_hourly
ON SCHEDULE
EVERY 1 HOUR
COMMENT 'Clears out sessions table each hour.'
DO
DELETE FROM site_activity.sessions;
CREATE EVENT e_call_myproc
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
DO CALL myproc(5, 27);
事件名称不区分大小写
在ON SCHEDULE子句中使用当前会话time_zone值解释时区。成为事件时区;也就是说,用于事件调度的时区,在事件执行时有效。这些时间将转换为UTC并与事件时区一起存储在mysql.event表中。这使得事件执行可以按定义进行,而不管服务器时区或夏时制的任何后续更改。
无法将参数直接传递给事件或从事件传递参数。但是,可以在事件中使用参数调用存储的例程
修改事件
ALTER
[DEFINER = user]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
[DO event_body]
ALTER EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
DO
TRUNCATE TABLE myschema.mytable;
ALTER EVENT olddb.myevent
RENAME TO newdb.myevent;
删除事件
DROP EVENT [IF EXISTS] event_name
删除后事件立即停止活动,并从服务器中完全删除