MySQL中的事件调度基础学习教程


本文整理自网络,侵删。

经常需要有一些定时任务在MySQL表上执行,例如统计、迁移、删除无用数据等。之前的作法是利用Linux cron定时运行脚本,但是发现这样的额外依赖有时并不方便,例如单机多实例部署时,就需要分别手动分别配置不同的cron任务,需要额外配置相应的用户和权限;新环境部署时容易遗漏cron任务等。

MySQL提供了Event Scheduler,与Linux下的crontab类似,可以根据时间调度来运行任务,运行一次或多次。

完整的Event Schduler创建语句如下:

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}

一、调度Scheduler
MySQL中的调度可以是只运行一次,也可以指定时间间隔重复运行。其定义是在event定义的ON SCHEDULE子句中。该子句格式如下:

ON SCHEDULE
AT timestamp [+ INTERVAL interval] …
| EVERY interval
  [STARTS timestamp [+ INTERVAL interval] …]
  [ENDS timestamp [+ INTERVAL interval] …]

其中,timestamp必须包括”年月日时分秒“,它参与表达式计算后,结果是datetime或者timestamp类型。

而时间间隔interval可以如下:

<数字> {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
      WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
      DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

其含义很清晰,如YEAR 年;QUARTER 季度;YEAR_MONTH 年+月;MINUTE_SECOND 分钟+秒。

补充:

YEAR | QUARTER | MONTH | YEAR_MONTH 后台都转换成MONTH,其他时间间隔都转换成SECOND
ON SCHEDULE中的时间使用创建时本会话中的时区信息time_zone,这个时区默认是服务端的全局time_zone,也可能后续手动更新掉。这些时间会转化成UTC时间,存储到mysql.event表中。
1.一次运行
AT直接指定时间,或者使用时间表达式计算得出确定的时间点。

示例:

AT '2006-02-10 23:59:00′   指定确切运行时间,本地时区。
AT current_timestamp + INTERVAL '1:15′ MINUTE_SECOND  指定1分15秒后运行。
2.多次运行
EVERY设置运行的时间间隔,这里不能再指定[+ INTERVAL interval]。

指定STARTS、ENDS是可选的。

STARTS是指定重复运行的第一次是什么时候。不指定的情况下,会在事件创建时运行第一次,即等价于STARTS CURRENT_TIMESTAMP!
ENDS告知MySQL结束重复运行的时间点。不指定的情况下,MySQL会永远重复运行下去。
示例:

EVERY 5 WEEK  每5周运行一次,创建时运行第一次。
EVERY 3 DAY STARTS '2013-12-4 09:10:00′  从'2013-12-4 09:10:00′开始运行第一次,每隔3天运行一次。
EVERY 2 MONTH STARTS CURRENT_TIMESTAMP + INTERVAL 10 MINUTE ENDS '2014-12-31 23:59:59′ 10分钟后开始到2014年底,每两个月运行一次。
二、事件Event
1.启用Event Scheduler功能
Event是由一个特定的Event Scheduler线程执行的,运行过程中可以通过show full processlist查看其当前状态信息,如:

7384313     event_scheduler     localhost     [NULL]     Daemon     3     Waiting on empty queue     [NULL]

默认事件调度Event Scheduler功能是未启用的,需要配置全局参数event_scheduler,本参数可以动态设置,即时生效。

event_scheduler有如下三种取值:

OFF/0 关闭,默认值。不运行Event Scheduler线程,也就无法进行事件调度。设置为ON可以立即启用。
ON/1 启用。
DISABLED 禁用。同样不运行Event Scheduler线程。只有在MySQL服务启动时设置才有用。当event_scheduler是ON或者OFF时,不能在运行时设置event_scheduler为DISABLED。如果启动时配置了event-scheduler=DISABLED,则运行时就不能设置为ON/OFF。换句话中,可以在MySQL服务启动时设置为DISABLED,然后完全禁用了event_scheduler,不能动态调整。
所以,要启用event_scheduler,运行时执行:

set global event_scheduler=on

要随MySQL服务一起启用,则在/etc/my.cnf中添加

[mysqld]
event-scheduler=on

2.创建事件的语法

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: 定义事件执行的时候检查权限的用户。
ON SCHEDULE schedule: 定义执行的时间和时间间隔。
ON COMPLETION [NOT] PRESERVE: 定义事件是一次执行还是永久执行,默认为一次执行,即NOT PRESERVE。
ENABLE | DISABLE | DISABLE ON SLAVE: 定义事件创建以后是开启还是关闭,以及在从上关闭。如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE。
COMMENT 'comment': 定义事件的注释。
 
3.更改事件的语法

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]

4.删除事件的语法

DROP EVENT [IF EXISTS] event_name

5.Do子句
在Do子句中实现事件的具体逻辑,几乎所有可以在存储程序中运行的MySQL语句都可以在event中使用。

阅读剩余部分

相关阅读 >>

mysql count查询速度很慢怎么办?mysql查询速度优化方案

mysql编程中的6个实用技巧

mysql数据库在centos7下无法远程连接的原因以及解决详解

vs2013连接mysql5.6成功案例一枚

mysql数据库自身缓存设置和分页

navicat如何给mysql还原数据库

mysql定义异常和异常处理详解

总结mysql存储过程in、out、inout参数示例

c++连接mysql的方法(直接调用c-api)

mysql中的sum函数使用教程

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...