MySQL 事件

事件

https://www.jianshu.com/p/8faa7dadd073
https://www.cnblogs.com/geaozhang/p/6821692.html

可以将数据库按自定义的时间周期触发某种操作,可以理解为时间触发器,类似于 linux 系统下面的任务调度器 crontab,或者类似与 window 下面的计划任务。

查看事件功能是否开启

-- 方式一
SHOW VARIABLES LIKE 'event_scheduler';
-- 方式二
SELECT @@event_scheduler;
-- 方式三
SHOW PROCESSLIST;

-- 查看事件状态
SHOW EVENTS;

如果看到 event_scheduleron 或者 PROCESSLIST 中显示有 event_scheduler 的信息说明就已经开启了事件。

开启事件功能

-- 方式一、通过动态参数修改,更改完这个参数就立刻生效了,但是重启mysql又还原了,即设置不能跨重启。
SET GLOBAL event_scheduler = ON;

-- 方式二、更改配置文件然后重启,在my.cnf中的[mysqld]部分添加如下内容,然后重启mysql。
event_scheduler=ON;

-- 方式三、直接在启动命令加上 "–event_scheduler=1"
mysqld ... --event_scheduler=ON

创建事件

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}
  1. definer:指明该 event 的用户,服务器在执行该事件时,使用该用户来检查权限。默认用户为当前用户。

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

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

    • 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)
    • every 子句用于创建重复执行的事件,如果每分钟执行一次,则可以:EVERY 1 MINUTE。当然,every 子句可以指定一个开始事件和结束时间,通过 STARTSENDS 关键字来表示,具体语法与前面类似,例如:EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK

  4. 通常情况下,如果一个事件过期已过期,则会被立即删除。但是,create event 定义中通过 on completion preserve 子句可以保留已过期的事件。默认:ON COMPLETION NOT PRESERVE,也就是不保存。

  5. [ENABLE | DISABLE | DISABLE ON SLAVE] 默认为 ENABLE,即创建后立即启用。

  6. comment 子句用于给事件添加注释。

  7. do 子句用于指示事件需要执行的操作,可以是一条 SQL 语句,也可以是被 begin...end 包括的语句块,也可以在语句块中调用存储过程。

修改事件

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]

删除事件

DROP EVENT [IF EXISTS] event_name;

事件使用举例

定时每隔 3 秒向表 test2 中插入数据

create event event_insert_t2
on schedule every 3 second
on completion preserve
do insert into test2(department,time_v) value('1',now());

创建一个 10 分钟后清空 test 表数据的事件

CREATE EVENT IF NOT EXISTS event_truncate_test2
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
-- AT TIMESTAMP '2020-8-13 22:40:21'  -- 指定时间删除
DO TRUNCATE TABLE test2;

每年定时执行函数

CREATE EVENT `creat_t_table_event`
ON SCHEDULE EVERY 1 YEAR STARTS '2020-12-31 00:00:00'
ON COMPLETION NOT PRESERVE
ENABLE
COMMENT '每年最后一天执行函数'
DO call creat_t_table(date_format(DATE_ADD(now(), INTERVAL 1 YEAR), '%Y'))

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:MySQL 事件

文章字数:931

本文作者:Bin

发布时间:2020-08-13, 23:04:29

最后更新:2020-08-13, 23:04:33

原始链接:http://coolview.github.io/2020/08/13/MySQL/MySQL%20%E4%BA%8B%E4%BB%B6/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录