MySQL Event

1.Event 简介

MySQL的Event是在相应的时刻调用的过程式数据库对象,由MySQL的事件调度器(Event Scheduler)来管理。
事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务。

2. 查看当前是否开启event scheduler

1
2
3
i:  show variables like '%event_scheduler%';
ii: select @@event_scheduler;
iii: show processlist; (是否有State为: Waiting for next activation的进程,User为event_scheduler)

第一种:

upload successful

第二种:

upload successful

第三种:

upload successful

3. 启动和关闭event scheduler方法

事件调度器由全局变量event_scheduler决定,它有三个可设定值:

  • OFF
  • ON
  • DISABLED

OFF: 事件调度器是关闭的,调度线程没有运行,并且在show processlist中不显示,默认值是OFF。

ON: 事件调度器是开启的,并且执行所有的调度事件,通过show processlist可以查看Waiting for next activation的进程。

DISABLED: 设置此值表示Event Scheduler是被禁止的,无法在MySQL运行状态下改变其值。

注意:
在MySQL启动时如果在my.cnf设置了event_scheduler=ON|OFF|1|0时,就不能在运行时修改为DISABLED,如果设置event_scheduler=DISBALED时,就不能在运行时修改其值为ON|OFF|1|0。

启动Event:

1
2
3
4
SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@hlobal.event_scheduler = 1;

关闭Event:

1
2
3
4
SET GLOBAL event_scheduler = OFF;
SET @@global.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@global.event_scheduler = 0;

4. 创建Event

每个事件由两个主要部分组成,第一部分是事件调度(Event Scheduler),表示事件何时启动以及按什么频率启动,第二部分是事件动作(Event Action),是事件启动时执行的代码,事件动作可以是SQL语句、存储过程、begin…end语句块。

4.1 语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE
[DEFINER = { user | CURRENT_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默认是当前创建Event的用户,服务器在执行该事件时,使用该用户来检查权限。

ON SCHEDULE 用来指定事件执行的时间和频率。

[ON COMPLETION [NOT] PRESERVE] 设置事件执行完毕后是否自动drop该事件,ON COMPLETION PRESERVE则不会被drop掉。

AT timestamp 表示在给定的timestamp或者datetime的时间执行一次

INTERVAL interval 表示从AT timestamp多久之后执行

EVERY interval 重复执行时间粒度

[ENABLE|DISABLE] 设置该事件创建后状态是否开启或关闭,默认为ENABLE

4.2 例子

创建事件表events_list用来记录事件调度的名字和时间戳,然后创建Event每秒执行一次。

4.2.1 创建测试表

upload successful

4.2.2 创建事件

upload successful

查看事件执行结果:

upload successful

5. 查看事件

show events;显示当前库中的事件。

upload successful
filename already exists, renamed

6. 修改事件

通过alter event语句可以修改事件的定义和属性,可以使一个事件成为停止的或者再次让它活动,也可以修改一个事件的名字或者整个调度,然而当使用ON COMPLETION NOT PRESERVE属性定义的事件最后一次执行后,事件就会被删除,不能修改。

6.1 语法

1
2
3
4
5
6
7
8
9
10

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 'string']
[DO event_body]

比如: 修改上面创建的事件为每一分钟执行一次

1
2
3
alter event event_every_second on schedule
every 1 minute
do insert into events_list values('event_now', now());

upload successful

修改事件为不再活动

1
alter event event_every_second disable;

7. 删除事件

语法:

1
DROP EVENT [IF EXISTS] event_name

upload successful

========================================================================

通过使用Event 机制可以完成一些数据库的定时操作,比如分区表的自动管理,将在分区表中进行介绍。

Reference:

https://blog.csdn.net/JesseYoung/article/details/35257527

<http://www.simlinux.com/2014/08/19/mysql-event-scheduler.html