详细分析Mysql中的定时任务(Event事件)

目录

  • 前言
  • [1. 基本知识](#1. 基本知识)
  • [2. Event事件](#2. Event事件)
  • [3. Demo](#3. Demo)

前言

基本的知识推荐阅读:

  1. 详细分析Mysql触发器的基本使用(图文解析)
  2. 详细分析SQL Server触发器的基本知识
  3. 详细分析Corn表达式(附Demo)
特性 事件定时任务 触发器
触发条件 基于时间 基于表中的 INSERT、UPDATE 或 DELETE 操作
使用场景 定时清理、报表生成、自动化维护 保证数据一致性、操作日志记录、自动级联操作
作用范围 可以跨多个表、数据库中的任意对象 只能作用于与触发器绑定的表
执行频率 按时间间隔执行(如每小时、每天等) 每次有数据变更(如插入、更新、删除)时立即执行
与时间的关系 完全基于外部时间 与时间无关,只与数据操作有关
执行的SQL 可以执行复杂的、跨表的SQL操作 只能与触发操作的表有关,常常用于表的自动操作

基本的Demo示例:

事件定时任务示例

场景:每天凌晨清理表 sessions 中超过 30 天未活跃的会话数据

sql 复制代码
CREATE EVENT clean_expired_sessions
ON SCHEDULE EVERY 1 DAY
STARTS '2024-09-23 00:00:00'
DO
  DELETE FROM sessions WHERE last_active < NOW() - INTERVAL 30 DAY;

触发器示例

场景:在 users 表中插入一条新记录时,自动在 user_logs 表中记录该操作

sql 复制代码
CREATE TRIGGER after_user_insert
AFTER INSERT ON users
FOR EACH ROW
  INSERT INTO user_logs (user_id, action, log_time)
  VALUES (NEW.id, 'insert', NOW());

1. 基本知识

MySQL 中的事件定时任务(Event Scheduler)允许你在指定的时间点或时间间隔自动执行SQL语句,类似于其他数据库中的计划任务(Scheduler)或Linux中的cron任务

事件任务可以用于自动化数据库维护、数据归档、统计、清理过期数据等

主要特性:

  • 可以在未来某一时间点执行任务,或以固定的时间间隔重复执行
  • 任务可以单次执行,也可以重复执行
  • 不需要外部工具,如 cron,直接在 MySQL 内部进行调度
  • 可以暂停或删除任务

事件调度器是MySQL管理定时任务的模块,它在后台运行并监控所有定义的事件

相关的系统变量:

  • event_scheduler: 控制事件调度器是否启用
  • ON:开启事件调度器
  • OFF: 关闭事件调度器,事件不会自动运行
  • DISABLED:调度器被禁用

查看当前事件调度器状态:SHOW VARIABLES LIKE 'event_scheduler';

开启事件调度器:SET GLOBAL event_scheduler = ON;

2. Event事件

创建和管理事件:事件调度器中的每一个任务称为一个事件(Event)

创建事件时,需要指定触发的时间、是否循环执行,以及事件的具体SQL操作

创建单次执行的事件

sql 复制代码
CREATE EVENT event_name
ON SCHEDULE AT '2024-09-22 12:00:00'
DO
  UPDATE my_table SET my_column = 'value' WHERE id = 1;

创建重复执行的事件

sql 复制代码
CREATE EVENT event_name
ON SCHEDULE EVERY 1 HOUR
STARTS '2024-09-22 12:00:00'
DO
  DELETE FROM my_table WHERE created_at < NOW() - INTERVAL 1 DAY;

删除事件

sql 复制代码
DROP EVENT IF EXISTS event_name;

修改事件

sql 复制代码
ALTER EVENT event_name
ON SCHEDULE EVERY 2 HOUR
DO
  INSERT INTO my_log (log_message) VALUES ('Scheduled task executed');

事件的组成部分

CREATE EVENT:定义事件
ON SCHEDULE: 定义任务的触发时间,AT:设定事件在指定的时间点执行。,EVERY:设定事件以固定的时间间隔执行(可结合 STARTS 和 ENDS 定义任务开始和结束时间)
DO:事件要执行的SQL语句
ENABLEDISABLE:决定事件是否启用
COMMENT:给事件添加注释

事件状态管理

启用或禁用事件

sql 复制代码
ALTER EVENT event_name ENABLE;
ALTER EVENT event_name DISABLE;

查看事件状态: 可以通过 INFORMATION_SCHEMA.EVENTS 查看数据库中所有的事件及其详细信息

sql 复制代码
SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME = 'event_name';

事件的生命周期

  • 永久事件:这些事件一旦被创建,会一直存在,直到手动删除或修改
  • 一次性事件:执行完一次之后就会自动删除

3. Demo

示例 1: 每天凌晨自动清理过期的会话数据

将在 2024-09-23 00:00:00 开始,每天运行一次。删除表 sessions 中最近 7 天未活跃的会话数据

sql 复制代码
CREATE EVENT clean_sessions
ON SCHEDULE EVERY 1 DAY
STARTS '2024-09-23 00:00:00'
DO
  DELETE FROM sessions WHERE last_active < NOW() - INTERVAL 7 DAY;

示例 2: 每月自动生成销售报表

每月执行一次,将当月的销售总额插入到 monthly_sales_report 表中,CURRENT_TIMESTAMP 表示事件从当前时间开始执行

sql 复制代码
CREATE EVENT generate_sales_report
ON SCHEDULE EVERY 1 MONTH
STARTS CURRENT_TIMESTAMP
DO
  INSERT INTO monthly_sales_report (report_month, total_sales)
  SELECT DATE_FORMAT(NOW(), '%Y-%m'), SUM(amount) FROM sales WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH);

示例 3: 一次性执行的临时任务

该事件将在 2024-09-25 14:00:00 执行一次,将最近 30 天登录过的用户状态更新为 'active'

sql 复制代码
CREATE EVENT temp_task
ON SCHEDULE AT '2024-09-25 14:00:00'
DO
  UPDATE user_data SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY;
相关推荐
野猪亨利66718 分钟前
Qt day1
开发语言·数据库·qt
siriuuus29 分钟前
Linux MySQL 多实例部署与配置实践
linux·运维·mysql
本就一无所有 何惧重新开始35 分钟前
Redis技术应用
java·数据库·spring boot·redis·后端·缓存
isaki13738 分钟前
qt day1
开发语言·数据库·qt
流星白龙1 小时前
【Qt】4.项目文件解析
开发语言·数据库·qt
小钻风33661 小时前
HTTPS是如何确保安全的
网络·数据库
王木风1 小时前
1分钟理解什么是MySQL的Buffer Pool和LRU 算法?
前端·mysql
CryptoPP1 小时前
获取越南股票市场列表(包含VN30成分股)实战指南
大数据·服务器·数据库·区块链
阿巴~阿巴~2 小时前
Redis重大版本演进全解析:从2.6到7.0
服务器·数据库·redis·ubuntu·缓存·centos
qq_404643343 小时前
MySQL中RUNCATE、DELETE、DROP 的基本介绍
数据库·mysql