在 MySql 5.1 的版本以后支持定时任务 Event Scheduler,有点类似于 Linux 的 contab,可以创建 Event 来定时执行 MySql 的语句,具体的文档详见 MySql 的官方文档http://dev.mysql.com/doc/refman/5.1/en/events-privileges.html。

1.开启

全局变量 event_scheduler 用来设定是否服务器端运行执行计划任务,该变量有如下三种值: OFF:计划任务处于停止状态,event scheduler 线程没有运行。是 event_scheduler 的默认值(执行一下任意一条命令关闭);

SET GLOBAL event_scheduler = OFF;
SET @@global.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@global.event_scheduler = 0;

ON:计划任务处于运行状态,event scheduler 线程启动,并执行所有的计划任务(执行一下任意一条命令开启);

SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;

DISABLED:该值将致使计划任务不可运行

运行 MySql 服务时候加上参数

--event-scheduler=DISABLED

或者在 my.cnf 中设置

event_scheduler=DISABLED

MySQL 的 Event Scheduler 是根据预先安排的计划进行数据库操作的数据库对象,可以看作是一种“时间触发器”。Event 实际上是被一个特殊的 event scheduler 线程执行的,假如它正在运行的话,可以通过 SHOW PROCESSLIST 命令看到它。

2.创建

创建的基本语法是:

CREATE EVENT        (1)
[IF NOT EXISTS]        (2)
event_name         (3)
ON SCHEDULE schedule      (4)
[ON COMPLETION [NOT] PRESERVE]   (5)
[ENABLE | DISABLE]       (6)
[COMMENT 'comment']       (7)
DO sql_statement        (8)

逐条介绍:

  • 创建 Event 嘛,这俩关键字当然不能少了
  • 如果不存在同名的数据库对象才创建
  • 计划任务的名字。作为数据库对象,都有一个本库内唯一的名字做标识
  • 计划任务的计划,重点就在这儿。有两个关键字来设定任务的执行计划:AT 和 EVERY:AT 指定的是一个一次性计划,后面跟着一个时间戳,后续的 sql 语句将在指定的时间被执行一次;EVERY 指定的是一个周期性计划,在该子句中可以指定从某时间点到某时间点期间,每隔某周期就执行一次该任务。
  • 任务整个执行完毕后,该计划任务对象是否还在数据库中保留。默认不保留
  • 有效或失效。默认有效
  • 真正要执行的语句

3.示例

1.每 10 秒钟向 myschema.mytable 表中插入时间戳:

CREATE EVENT e_store_ts ON SCHEDULE EVERY 10 SECOND DO INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP());

2.在 2008-02-06 23:59:00 开始的一年内,每隔 1 小时就删除掉 messages 表的早先的 10 条记录:

CREATE EVENT e_hourly
           ON SCHEDULE
           EVERY 1 HOUR STARTS ’2007-02-10 23:59:00′ ENDS ’2008-02-10 23:59:00′
           DO
           DELETE FROM messages limit 10;

4.查看 EVENT

mysql>SELECT * FROM INFORMATION_SCHEMA.EVENTS
     >   WHERE EVENT_NAME='e_store_ts'
     >   AND EVENT_SCHEMA='myschema'\G
*************************** 1. row ***************************
   EVENT_CATALOG: NULL
    EVENT_SCHEMA: myschema
      EVENT_NAME: e_store_ts
         DEFINER: jon@ghidora
      EVENT_BODY: SQL
EVENT_DEFINITION: INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP())
      EVENT_TYPE: RECURRING
      EXECUTE_AT: NULL
  INTERVAL_VALUE: 5
  INTERVAL_FIELD: SECOND
        SQL_MODE: NULL
          STARTS: 0000-00-00 00:00:00
            ENDS: 0000-00-00 00:00:00
          STATUS: ENABLED
   ON_COMPLETION: NOT PRESERVE
         CREATED: 2006-02-09 22:36:06
    LAST_ALTERED: 2006-02-09 22:36:06
   LAST_EXECUTED: NULL
   EVENT_COMMENT:
1 row in set (0.00 sec)

5.删除 EVENT

DELETE FROM mysql.event
    WHERE db = 'myschema'
      AND definer = 'jon@ghidora'
      AND name = 'e_insert';

转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

谢谢打赏

本文链接地址: MySql 定时任务 Event Scheduler

知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可