MySQL事件


事件介绍

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';

4.查询指定事件具体内容

SHOW CREATE EVENT `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;
<think>嗯,用户想了解MySQL事件调度器的用法和配置。我需要先回顾一下事件调度器的基本概念。首先,事件调度器是MySQL中用来执行定时任务的工具,类似于操作系统的计划任务。用户可能需要用它来自动执行数据库维护、数据清理或者生成报表之类的任务。 接下来,我得整理一下如何启用事件调度器。根据之前的引用,用户可以通过修改配置文件永久开启,或者使用SQL命令临时开启。记得要提到不同版本MySQL的差异,比如旧版本可能需要重启服务,而新版本可以直接用SET GLOBAL命令。 然后是创建事件的步骤。用户需要知道基本语法,比如CREATE EVENT,指定时间、间隔和要执行的SQL语句。可能需要举例说明,比如每天凌晨清理日志表。还要提到事件调度器的参数,比如是否重复执行,开始和结束时间等。 接下来要考虑用户可能遇到的问题,比如权限问题。事件执行时需要有足够的权限,可能需要提到DEFINER用户是否有权限执行相关操作。另外,事件的状态,启用还是禁用,也很重要。用户可能需要知道如何查看现有的事件,使用SHOW EVENTS或者查询information_schema表。 另外,注意事项部分,需要提醒用户事件调度器的资源消耗,尤其是在高并发环境下。还有时区设置的问题,避免因为时区不一致导致任务执行时间不符合预期。最后,备份事件定义的方法,比如使用SHOW CREATE EVENT导出语句。 在生成相关问题时,要考虑用户可能的后续疑问,比如如何监控事件执行情况,事件失败的处理方法,或者如何调试事件中的SQL语句。这些都能帮助用户更全面地理解和使用事件调度器。 总结一下,回答的结构应该是先介绍事件调度器,然后启用方法,创建步骤,管理方法,注意事项,最后相关问题。确保各部分内容清晰,引用正确的参考资料,同时使用正确的中文表达和LaTeX格式。避免技术错误,比如配置文件的路径是否正确,或者语法是否正确,需要仔细检查。</think>### MySQL 事件调度器的使用与配置 #### 一、什么是 MySQL 事件调度器? MySQL 事件调度器(Event Scheduler)是 MySQL 提供的一种自动化任务执行机制,类似于操作系统的“计划任务”。通过预定义事件,可以定时执行 SQL 语句或存储过程,例如定期清理日志、生成报表或备份数据[^1]。 --- #### 二、启用事件调度器 1. **临时启用(仅当前会话生效)** 执行 SQL 命令: ```sql SET GLOBAL event_scheduler = ON; ``` 2. **永久启用(重启后仍生效)** 编辑 MySQL 配置文件(如 `my.cnf` 或 `my.ini`),在 `[mysqld]` 部分添加: ```ini event_scheduler = ON ``` 重启 MySQL 服务生效[^2]。 --- #### 三、创建事件 **语法示例**: ```sql CREATE EVENT event_name ON SCHEDULE schedule DO BEGIN -- 执行的 SQL 语句 END; ``` **参数说明**: - `schedule`:定义执行时间,支持单次执行或循环执行。 例如:`EVERY 1 DAY STARTS '2024-01-01 00:00:00'` 表示每天执行一次。 **示例**:每天凌晨清理日志表 ```sql CREATE EVENT clean_logs ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY DO DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY; ``` --- #### 四、管理事件 1. **查看事件** ```sql SHOW EVENTS FROM database_name; -- 或查询 information_schema.events 表 SELECT * FROM information_schema.events; ``` 2. **修改事件** 使用 `ALTER EVENT`: ```sql ALTER EVENT clean_logs ON SCHEDULE EVERY 2 DAY; -- 修改为每两天执行一次 ``` 3. **删除事件** ```sql DROP EVENT clean_logs; ``` --- #### 五、注意事项 1. **权限要求** 创建事件需具备 `EVENT` 权限,且事件中 SQL 语句的执行权限由 `DEFINER` 用户决定[^3]。 2. **事件状态** 事件默认启用,可通过 `ALTER EVENT ... DISABLE` 禁用。 3. **时区问题** 事件调度器使用系统时区,建议在配置中统一时区设置。 4. **资源消耗** 高频事件可能增加数据库负载,需合理设计执行频率。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值