详细分析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;
相关推荐
陈卓41027 分钟前
MySQL-主从复制&分库分表
android·mysql·adb
IT项目管理1 小时前
达梦数据库DMHS介绍及安装部署
linux·数据库
你都会上树?1 小时前
MySQL MVCC 详解
数据库·mysql
大春儿的试验田1 小时前
高并发收藏功能设计:Redis异步同步与定时补偿机制详解
java·数据库·redis·学习·缓存
Ein hübscher Kerl.2 小时前
虚拟机上安装 MariaDB 及依赖包
数据库·mariadb
长征coder2 小时前
AWS MySQL 读写分离配置指南
mysql·云计算·aws
醇醛酸醚酮酯2 小时前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
ladymorgana3 小时前
【docker】修改 MySQL 密码后 Navicat 仍能用原密码连接
mysql·adb·docker
PanZonghui3 小时前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql
GreatSQL社区3 小时前
用systemd管理GreatSQL服务详解
数据库·mysql·greatsql