MySQL事件调度器event的使用

Q:假设,有一个需求,希望在某一个时刻系统调用一个begin end执行一下;十分钟以后执行一下begin end。亦或有一个需求,每个多长时间周期性执行begin end。那么这个时候该怎么办呢?

A:

  在Linux里面可以使用at、crontab来实现上面的需求;MySQL里面也有这样的方法,就是event对象。

  也被称为MySQL事件调度器(Event Scheduler),可以在某一个时间点执行一个SQL语句或一个语句块(BEGIN ... END);或者每隔固定间隔重复执行。类似于Linux下的at、crontab或Windows下的Task Scheduler。

那么如何使用event,步骤如下:

1、开启数据库的event执行调度

> 查看是否开启定时器

mysql> show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name  | Value |
+-----------------+-------+
| event_scheduler | OFF  |
+-----------------+-------+

>开启

0:off

1:on

mysql> set global event_scheduler=1;
mysql
> exit
Bye

[root@linuxidc
~]# mysql -uroot -p123

mysql
> show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name  | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

注意:

  如果是设定事件计划为0 或OFF,即关闭事件计划进程的时候,不会有新的事件执行,但现有的正在运行的事件会执行到完毕。

  对于线上环境来说,使用even时,注意在主库上开启定时器,从库上关闭定时器,event触发所有操作均会记录binlog进行主从同步,从库上开启定时器很可能造成卡库。切换主库后之后记得将新主库上的定时器打开。

2、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;

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的用户,服务器在执行该事件时,使用该用户来检查权限。

  默认用户为当前用户,即definer = current_user;

  如果明确指明了definer,则必须遵循如下规则:

    1.如果没有super权限,唯一允许的值就是自己当前用户,而不能设置为其他用户。

    2.如果具有super权限,则可以指定任意存在的用户;如果指定的用户不存在,则事件在执行时会报错。

if not exists:如果事件已经存在,则不会创建,也不会报错。

on schedule子句:指定何时执行该事件,以及如何执行该事件

  1)at timestamp用于创建单次执行的事件,timestamp执行事件执行的时间(如果指定的时间是过去的时间,则会产生一个warning),时间可以是具体的时间字符串或者是一个datetime类型的表达式(如current_timestamp):

    如果要指定将来某个时间,直接使用at timestamp,例:at '2017-08-08 08:08:08';

    如果要指定将来某个时间间隔,可利用interval关键字(interval关键字可以进行组合,at timestamp + INTERVAL 2 HOUR、 + INTERVAL 30 MINUTE)

  2)every子句用于创建重复执行的事件,如果每分钟执行一次,则可以:EVERY 1 MINUTE。

    当然,every子句可以指定一个开始事件和结束时间,通过STARTS和ENDS关键字来表示,具体语法与前面类似

  例如:EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bbf0df5d5e3c73edbddd4f83b272952d.html