MySQL 事件

以下示例都以 Mysql5.7 为基础

++mysql的事件(event)就相当于Linux下的cron任务计划,只不过它可以调用一次或重复调用,并且它的精度可精确到秒。++

语法

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 'comment']
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}
  • [IF NOT EXISTS]: 如果已经存在相同事件名,那就不创建事件,但会有一个警告提示。

  • event_name: 事件名称,不区分大小写,最好与存储过程名称一致。

  • ON SCHEDULE schedule: 调度字句,确定事件执行的时间与次数。两种形式。

    • schedule第一种形式

      AT timestamp:一个时间点,只执行一次。

      1
      2
      3
      4
      CREATE EVENT e_at
      ON SCHEDULE AT '2006-02-10 23:59:00'
      COMMENT '在2006-02-10 23:59:00清空表 tab_a'
      DO DELETE FROM tab_a;
    • schedule第二种形式

      EVERY interval:每隔一段时间执行一次,循环执行。

      1
      2
      3
      4
      5
      6
      CREATE EVENT e_hourly
      ON SCHEDULE
      EVERY 1 HOUR
      COMMENT '每小时清空表 tab_a'
      DO
      DELETE FROM tab_a;
  • [ON COMPLETION [NOT] PRESERVE]: 默认值,事件执行后删除事件,不再执行。

  • [ENABLE | DISABLE | DISABLE ON SLAVE]: 是否执行事件,如果是主从模式的从数据库那就是关闭的。

  • [COMMENT ‘comment’]: 这个事件的注释,64字符。

  • DO event_body: 待执行的sql语句。

更多示例

1
2
3
4
5
6
7
create event 
if not exists event_1
on schedule
every 30 MINUTE
on completion preserve
comment '每30分钟执行一次procedure1存储过程'
do call procedure1();
1
2
3
4
5
create event event_2
on schedule
at CURRENT_TIMESTAMP + INTERVAL 5 DAY
comment '5天后清空表tab_2';
do truncate table tab_2;
1
2
3
4
5
6
create event event_3
on schedule
every 1 DAY
starts CURRENT_TIMESTAMP + INTERVAL 5 DAY
comment '5天后开始每天清空表tab_3';
do truncate table tab_3;
1
2
3
4
5
6
7
create event event_4
on schedule
every 1 DAY
starts CURRENT_TIMESTAMP + INTERVAL 5 DAY
ends CURRENT_TIMESTAMP + INTERVAL 1 MONTH
comment '5天后开始每天清空表tab_4,1个月后结束';
do truncate table tab_4;
1
2
3
4
5
6
create event event_5
on schedule
every 1 DAY
on completion not preserve
comment '每天清空表tab_5,但执行一天后,事件不再执行,被删除';
do truncate table tab_5;

更多命令

关闭事件

1
alter event event_1 disable;

相对应的开启事件

1
alter event event_1 enable;

删除事件

1
drop event [if exists] event_name;

查看当前事件

1
show events\G;

查看当前正在执行的线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)

参考mysql官方文档

0%