MySQL事件调度器 CREATE EVENT

本文深入探讨了MySQL从5.1版本开始支持的Event功能,详细介绍了如何创建定时任务、调整执行时间、注释及管理事件的方法。包括通过SQL语句实现每天、每月或每季度的特定时刻执行数据更新操作,同时提供了实例演示及关键语句查询、设置等操作,帮助开发者高效管理数据库中的定时任务。

MySQL从5.1开始支持Event功能,有点类似于MsSQL的Job,可以定时自动执行数据汇总。

【语法】

CREATE EVENT [IF NOT EXISTS] event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE]
    [COMMENT 'comment']
    DO sql_statement;
schedule:
    AT timestamp [+ INTERVAL interval]
  | EVERY interval [STARTS timestamp] [ENDS timestamp]
interval:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

其中,
event_name:定时器名,最大长度64个字符,若未指定,则默认为当前的MySQL用户名(不区分大小写);

schedule:限定执行时间;

ON COMPLETION [NOT] PRESERVE:表示是否需要循环复用这个Event;

sql_statement:要执行的SQL语句(也可以使用存储过程代替传统的SQL语句);

comment:对该时间调度器的一个注释,最大长度64个字符;

【关闭事件】

ALTER EVENT event_name ON
COMPLETION PRESERVE DISABLE;

【开启事件】

ALTER EVENT event_name ON
COMPLETION PRESERVE ENABLE;


【删除事件】

DROP EVENT [IF EXISTS] event_name


【注意】
:要使用定时器,MySQL的常量GLOBAL event_scheduler必须为on或者是1.


【范例】

1. 每天凌晨1点开始执行数据更新:

CREATE EVENT [IF NOT EXISTS] E_testEvent_1 
	ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR) 
	ON COMPLETION PRESERVE ENABLE 
	DO
		UPDATE _T_test SET col= 2 where ValidityDate < now();

2. 每月第一天凌晨1点开始执行数据更新(使用存储过程):

CREATE EVENT E_testEvent_2 
	ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR)
	ON COMPLETION PRESERVE ENABLE
	DO
	BEGIN
		CALL P_testProcedureName();
	END

3. 每季度第一天凌晨1点开始执行数据更新:

CREATE EVENT E_testEvent_3  
	ON SCHEDULE EVERY 1 QUARTER STARTS DATE_ADD(DATE_ADD(DATE( CONCAT(YEAR(CURDATE()),'-',ELT(QUARTER(CURDATE()),1,4,7,10),'-',1)),INTERVAL 1 QUARTER),INTERVAL 2 HOUR)
	ON COMPLETION PRESERVE ENABLE
	DO
		UPDATE _T_test SET col= 2 where ValidityDate < now();

【一些Event相关语句】

1. 查看是否开启定时器

SHOW VARIABLES LIKE '%sche%';

2. 开启定时器 0:off 1:on

SET GLOBAL event_scheduler = 1;




### MySQL 事件调度器Event Scheduler)的使用与配置 MySQL事件调度器Event Scheduler)允许用户在数据库中创建定时任务,类似于操作系统的 cron 作业。以下是关于如何启用、配置和使用 MySQL 事件调度器的详细说明。 #### 1. 检查 MySQL 版本 确保所使用的 MySQL 版本不低于 5.1.6,因为事件调度器功能自该版本起才被引入[^2]。可以通过以下 SQL 命令检查 MySQL 的版本: ```sql SELECT VERSION(); ``` #### 2. 启用事件调度器 默认情况下,事件调度器可能未启用。可以通过修改 `event_scheduler` 系统变量来启用它。有以下几种方式: - **临时启用**:通过会话或全局设置启用事件调度器。此更改仅对当前会话或服务器重启前有效。 ```sql SET GLOBAL event_scheduler = ON; ``` - **永久启用**:编辑 MySQL 配置文件(如 `my.cnf` 或 `my.ini`),添加或修改以下内容以确保每次启动时自动启用事件调度器: ```ini [mysqld] event_scheduler=ON ``` 确认事件调度器的状态是否已启用: ```sql SHOW VARIABLES LIKE 'event_scheduler'; ``` 如果返回值为 `ON`,则表示事件调度器已启用[^2]。 #### 3. 创建事件 创建事件的语法如下: ```sql CREATE EVENT event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] DO sql_statement; ``` - **`event_name`**:事件的名称。 - **`schedule`**:定义事件的执行时间,可以是单次执行或周期性执行。 - 单次执行:`AT TIMESTAMP` - 周期性执行:`EVERY interval` - **`ON COMPLETION`**:指定事件完成后是否保留。 - **`ENABLE/DISABLE`**:控制事件是否立即生效。 - **`sql_statement`**:事件触发时要执行的 SQL 语句。 ##### 示例 1:创建一个单次执行的事件 以下示例将在 1 小时后删除表 `old_data` 中的所有数据: ```sql CREATE EVENT delete_old_data ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO DELETE FROM old_data; ``` ##### 示例 2:创建一个周期性执行的事件 以下示例将每 1 天清理一次 `logs` 表中超过 30 天的数据: ```sql CREATE EVENT cleanup_logs ON SCHEDULE EVERY 1 DAY DO DELETE FROM logs WHERE created_at < DATE_SUB(CURDATE(), INTERVAL 30 DAY); ``` #### 4. 查看现有事件 可以通过查询 `information_schema.EVENTS` 表来查看当前数据库中的所有事件: ```sql SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'your_database_name'; ``` #### 5. 修改或删除事件 - **修改事件**:使用 `ALTER EVENT` 语句修改现有事件的属性或执行逻辑。 ```sql ALTER EVENT cleanup_logs ON SCHEDULE EVERY 2 DAYS; ``` - **删除事件**:使用 `DROP EVENT` 语句删除不再需要的事件。 ```sql DROP EVENT cleanup_logs; ``` #### 6. 注意事项 - 确保事件调度器已启用,否则事件不会被执行。 - 事件的执行依赖于 MySQL 服务的正常运行。如果 MySQL 服务中断,事件可能会错过预定的执行时间。 - 如果需要更高的实时性,MySQL事件调度器可以实现秒级任务,这比操作系统的任务调度器更灵活[^3]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值