MySQL事件
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
文章目录
事件介绍
MySQL事件(event)是根据指定时间表执行的任务称为计划事件。事件包含一个或多个SQL语句的对象。一个事件可调用一次也可周期性的启动。因为它们是由时间触发的所以MySQL事件也称为时间触发器
事件和触发器相似都是在某些事情发生的时候启动因此事件也可称为临时触发器。
- 事件基于特定时间周期触发来执行某些任务
- 触发器基于某个表所产生的
MySQL事件由一个特定的线程来管理的也就是所谓的事件调度器。
事件调度器可以在指定的时刻执行某些特定的任务并以此可取代原先只能由操作系统的计划任务来执行的工作。这些在指定时刻才能被执行的任务就是事件这些任务通常是一些确定的SQL语句集合。
事件调度
事件由一个特定的线程来管理。启用事件调度器后拥有SUPER权限的账户执行SHOW PROCESSLIST就可以看到这个线程了。
事件调度核心参数event_scheduler
查询事件调度状态
以下几种方式都可以
方式1
SHOW VARIABLES LIKE 'event_scheduler';
方式2
SELECT @@event_scheduler;
方式3
SHOW processlist;
- event_scheduler=NO说明已经开启了event_scheduler=OFF设没开启
- processlist命令查看得到event_scheduler的信息则说明已经开启否则没开启
开关事件调度(临时)
1. 开启事件调度(临时)
以下任意命令都可以该配置只是临时生效重启后失效。
SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;
2. 关闭事件调度(临时)
以下任意命令都可以该配置只是临时生效重启后失效。
SET GLOBAL event_scheduler = OFF;
SET @@global.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@global.event_scheduler = 0;
开关事件调度(永久)
上面的方式都只是临时生效重启MySQL就会恢复之前状态。要想永久生效需要在配置文件my.ini中配置参数。
event_scheduler = 1 #开启事件
event_scheduler = 0 #关闭事件
MySQL8.0版本event_scheduler默认是1。
事件使用
创建事件
语法
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;
示例
CREATE DEFINER = `root`@`%` EVENT IF NOT EXISTS event1
ON SCHEDULE EVERY 1 MONTH STARTS '2023-01-20 00:00:00' ENDS '2025-01-20 00:00:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT '测试事件1'
DO BEGIN
INSERT INTO table1 (`id`) VALUES (12);
END;
语法子句分析
子句 | 是否必选 | 描述 |
---|---|---|
DEFINER | 可选 | 定义事件执行时检查权限的用户 |
IF NOT EXISTS | 可选 | 判断要创建的事件是否存在 |
EVENT event_name | 必选 | 指定事件名称 |
ON SCHEDULE schedule | 必选 | 定义执行计划执行的时间和时间间隔 schedule具体的执行计划规则 |
ON COMPLETION [NOT] PRESERVE | 可选 | 定义事件是否循环执行 指定事件一次执行还是永久执行默认NOT PRESERVE一次执行 |
ENABLE | DISABLE | DISABLE ON SLAVE | 可选 | 指定事件是否开启默认ENABLE ENABLE开启 DISABLE关闭 DISABLE ON SLAVE从库中关闭 |
COMMENT ‘comment’ | 可选 | 定义事件的注释 comment注释内容 |
DO event_body | 必选 | 指定事件启动时所要执行的事件主体代码 可以是任何有效的SQL语句、存储过程或者一个计划执行的事件。如果包含多条语句则可以使用 BEGIN…END 复合结构 event_body执行的代码 |
执行计划子句
语法ON SCHEDULE schedule
- schedule具体的执行计划规则
1. 一次性事件
语法AT timestamp [+ INTERVAL]
某一时间执行一次
ON SCHEDULE AT '2023-02-01 00:00:00'
ON SCHEDULE AT '2023-02-01 00:00:00' + INTERVAL 1 DAY
2. 重复性事件
语法EVERY interval STARTS timestamp [+INTERVAL] [ENDS timestamp [+INTERVAL]]
在开始结束时间范围内每间隔指定时间就执行一次
EVERY 1 MONTH STARTS '2023-01-20 00:00:00' ENDS '2025-01-20 00:00:00'
EVERY 1 MONTH STARTS '2023-01-20 00:00:00' + INTERVAL 1 DAY ENDS '2025-01-20 00:00:00' + INTERVAL 1 DAY
结束时间可以不指定但开始时间必须指定。
事件主体子句
语法DO event_body
指定事件启动时所要执行的事件主体代码。
- event_body执行的代码
可以是任何有效的SQL语句、存储过程或者一个计划执行的事件。如果包含多条语句则可以使用 BEGIN…END 复合结构。
DO INSERT INSERT INTO time_table (`id`) VALUES (12)
查询事件
1. 当前数据库所有事件信息
show events;
条件筛选
show events like '%event_name%';
2. 指定数据库所有事件信息
show events from demo;
条件筛选
show events from demo WHERE name like 'event_name';
3.从events表直接查询事件信息
select * from information_schema.events where EVENT_SCHEMA='demo' and EVENT_NAME='event_name';
修改事件
1. 启用禁用事件
--开启事件
alter event event_name enable;
--关闭事件
alter event event_name disable;
2. 修改执行计划
ALTER EVENT event_name ON SCHEDULE schedule;
3. 修改事件主体
ALTER EVENT event_name DO event_body;
4. 重命名事件
ALTER EVENT event_name RENAME TO new_event_name;
5. 移动事件到其他数据库
可修改事件名称
ALTER EVENT demo.event_name RENAME TO test.event_name;
删除事件
drop event event_name;