事件
17.1 事件概述
在MySQL 5.1中新增了一个特色功能事件调度器(Event Scheduler),简称事件。它可以作为定时任务调度器,取代部分原来只能用操作系统的计划任务才能执行的工作。另外,更值得一提的是,MySQL的事件可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下是非常实用的。
事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。
事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于他们彼此相似,所以事件也称为临时性触发器。
事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。
17.1.1 查看事件是否开启
事件由一个特点的线程来管理。启动事件调度器后,拥有SUPER权限的账户执行SHOW PROCESSLIST命令就可以看到这个线程了。查看事件是否开启代码:
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;
17.1.2 开启事件
通过设定全局变量event_scheduler的值即可动态的控制事件调度器是否启用。开启MySQL的事件调度器,可以通过下面两种方式实现。
1.通过设置全局参数修改
在MySQL的命令行窗口中,使用SET GLOBAL命令可以开启或关闭事件。将event_scheduler参数的值设置为ON,则开启事件;如果设置为OFF,则关闭事件。查看事件是否开启代码:
SET GLOBAL event_scheduler = ON;
SHOW VARIABLES LIKE 'event_scheduler';
注意:如果想要始终开启事件,那么在使用SET GLOBAL开启事件后,还需要在my.ini/my.cnf中添加event_scheduler = ON。因为如果没有添加,MySQL重启事件又会回到原来的状态。
2.更改配置文件
在MySQL的配置文件my.ini(Windows系统)/my.cnf(Linux系统)中,找到[mysqld],然后在下面添加以下代码开启事件。
event_scheduler = ON
在配置文件中添加代码并保存文件后,还需要重新启动MySQL服务器才能生效。通过该方法开启事件,重启MySQL服务器后,不恢复为系统默认的未开启状态。
17.2 创建事件
在MySQL 5.1以上版本中,可以通过CREATE EVENT语句来创建事件,语法格式:
CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;
从上面的语法中,可以看出CREATE EVENT语句由多个子句组成,各子句的详细说明如下:
子句 | 说明 |
DEFINER | 可选,用于定义事件执行的时候检查权限的用户 |
IF NOT EXISTS | 可选,用于判断要创建的事件是否存在 |
EVENT event_name | 必选,用于指定事件名,event_name的最大长度为64个字符,如果未指定event_name, 则默认为当前的MySQL用户名(不区分大小写) |
ON SCHEDULE schedule | 必选,用于定义执行的时间和时间间隔 |
ON COMPLETION [NOT] PRESERVE | 可选,用于定义事件是否循环执行,即是一次执行还是永久执行,默认为一次执行,即NOT PRESERVE |
ENABLE | DISABLE | DISABLE ON SLAVE | 可选,用于指定事件的一种属性。定义事件创建以后是开启还是关闭,以及在从上关闭。如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE |
COMMENT 'comment' | 可选,用于定义事件的注释 |
DO event_body | 必选,用于指定事件启动时所需要执行的代码 |
在ON SCHEDULE子句中,参数schedule的值为一个AS子句,用于指定事件在某个时刻发生,语法格式如下:
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
参数说明:
- timestamp:表示一个具体的事件点,后面加上一个时间间隔,表示在这个时间间隔后事件发生。
- EVENT子句:用于表示事件在指定时间区间每隔多长时间发生一次,其中STARTS子句用于指定款式时间;ENDS子句用于指定结束时间。
- 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}
17.3 修改事件
在MySQL5.1及以后版本中,事件被创建之后,还可以使用ALTER EVENT语句修改其定义和相关属性,语法格式如下:
ALTER
[DEFINER = { user | CURRENT_USER }]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
[DO event_body]
ALTER EVENT语句的使用语法与CREATE EVENT语句基本相同。ALTER EVENT语句还有一个用法就是让一个事件关闭或再次让其活动。一个事件最后一次被调用后,它是无法被修改的,因为此时它已经存在了。
请注意,ALTER EVENT语句仅适用于存在的事件。如果您尝试修改不存在的事件,MySQL将会发出一条错误消息,因此在更改事件之前,应先使用SHOW EVENT语句检查事件的存在。
17.4 删除事件
在MySQL5.1及以后版本中,删除已经创建的事件可以使用DROP EVENT语句来实现,语法格式如下:
DROP EVENT [IF EXISTS] event_name