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_scheduler
为 on
或者 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}
definer
:指明该 event 的用户,服务器在执行该事件时,使用该用户来检查权限。默认用户为当前用户。if not exists
:如果事件已经存在,则不会创建,也不会报错。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
子句可以指定一个开始事件和结束时间,通过STARTS
和ENDS
关键字来表示,具体语法与前面类似,例如:EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK
。
通常情况下,如果一个事件过期已过期,则会被立即删除。但是,create event 定义中通过
on completion preserve
子句可以保留已过期的事件。默认:ON COMPLETION NOT PRESERVE
,也就是不保存。[ENABLE | DISABLE | DISABLE ON SLAVE]
默认为 ENABLE,即创建后立即启用。comment
子句用于给事件添加注释。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" 转载请保留原文链接及作者。