MySQL Event Scheduler 详解

news2025/1/15 19:08:37

官网文档:MySQL :: MySQL 8.4 Reference Manual :: 27.4.1 Event Scheduler Overview

一 引入

MySQL 的 Event Scheduler(事件调度器)功能首次在 MySQL 5.1 中引入,旨在让用户能够在数据库中定义和管理计划任务。它类似于操作系统中的任务调度工具(如 Cron),但在 MySQL 中运行,主要用来自动执行周期性的任务或在特定时间点运行一次的任务。

二 作用

Event Scheduler 的主要作用是 自动化数据库操作,包括但不限于:

  1. 定时清理数据:如清除过期的会话数据或日志。
  2. 周期性数据汇总:定时生成统计报告或汇总表。
  3. 维护任务:如重建索引或更新缓存表。
  4. 业务逻辑实现:实现特定的时间触发事件(如发送提醒或通知)。

它的优势在于任务直接运行在数据库内,不需要额外依赖外部脚本或调度工具。


三 使用方法

1. 启用事件调度器

默认情况下,MySQL 的 Event Scheduler 是关闭的。可以通过以下方式开启:

  • 临时启用(仅当前会话有效):

    SET GLOBAL event_scheduler = ON; 
  • 配置永久启用: 编辑 MySQL 配置文件(my.cnf),添加以下内容:

    [mysqld] 
    event_scheduler=ON 

2. 创建事件

MySQL 中通过 CREATE EVENT 语句来创建事件。

  • 创建一个在指定时间运行一次的事件:

    CREATE EVENT example_event 
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY 
    DO 
    INSERT INTO example_table (message, created_at) 
    VALUES ('Hello, Event!', NOW()); 
  • 创建一个周期性运行的事件:

    CREATE EVENT clean_up_logs 
    ON SCHEDULE EVERY 1 DAY 
    STARTS '2025-01-15 00:00:00' 
    DO 
    DELETE 
    FROM logs 
    WHERE created_at < NOW() - INTERVAL 30 DAY; 

3. 查询事件

查看当前数据库中定义的事件:

SELECT * 
FROM INFORMATION_SCHEMA.EVENTS 
WHERE EVENT_SCHEMA = 'your_database_name'; 

4. 修改事件

通过 ALTER EVENT 修改事件:

ALTER EVENT clean_up_logs 
ON SCHEDULE EVERY 2 DAY; 

5. 删除事件

通过 DROP EVENT 删除事件:

DROP EVENT IF EXISTS example_event; 

四 详细示例

以下是一个更完整的使用场景示例:

场景:公司需要每日凌晨自动清理过期会话,同时每周统计用户活跃数据。

  1. 清理过期会话

    CREATE EVENT delete_expired_sessions 
    ON SCHEDULE EVERY 1 DAY 
    STARTS '2025-01-15 00:00:00' 
    DO 
    DELETE FROM user_sessions WHERE expired = 1; 
  2. 每周统计用户活跃数据

    CREATE EVENT weekly_user_statistics 
    ON SCHEDULE EVERY 1 WEEK 
    STARTS '2025-01-15 02:00:00' 
    DO 
    INSERT INTO user_statistics (week_start, active_users) 
    SELECT DATE(NOW() - INTERVAL 1 WEEK) AS week_start, COUNT(*) AS active_users 
    FROM users 
    WHERE last_login >= NOW() - INTERVAL 1 WEEK; 

五 使用时的注意事项

  1. 权限问题

    • 创建事件需要 EVENT 权限,检查权限:
      SHOW GRANTS FOR 'user'@'host'; 
  2. 性能影响

    • 复杂或频繁触发的事件可能对数据库性能产生负面影响。应避免事件操作长时间锁定表。
  3. 时间同步

    • Event Scheduler 依赖服务器时间,如果时间配置不准确(如未正确设置时区),可能导致事件触发错误。
  4. 备份与恢复

    • 事件定义存储在 INFORMATION_SCHEMA.EVENTS 中,确保备份恢复策略包括事件的重新部署。

六 相关功能及其区别

功能作用使用场景
Event Scheduler定时运行 SQL 任务定期维护数据库、数据清理、周期性数据分析
触发器 (Trigger)响应表中的增删改操作业务逻辑强关联的实时任务,如日志记录
存储过程 (Procedure)封装复用的业务逻辑执行复杂业务逻辑或多步骤操作
视图 (View)动态查询结果的逻辑表示简化复杂查询,增强数据访问的安全性
外部任务调度 (如 Cron)数据库外的调度工具数据库外部任务调度(跨系统、跨数据库操作)

     区别与使用场景

  1. Event Scheduler vs. Cron
    • Event Scheduler:内置于 MySQL,适用于数据库内部的自动化任务。
    • Cron:更强大,适合管理跨系统任务。
  2. Event Scheduler vs. Trigger
    • Event Scheduler:基于时间触发,适用于定时任务。
    • Trigger:基于表操作触发,适用于实时响应任务。
  3. Event Scheduler vs. Procedure
    • Event Scheduler:主要作用是定时调用 SQL 操作。
    • Procedure:封装可复用的业务逻辑,事件和外部程序均可调用。

七 总结

MySQL Event Scheduler 是一个强大的内置工具,适合处理周期性任务或时间触发任务。然而,需要注意性能优化、权限配置以及任务的复杂度管理。如果你的场景涉及跨系统或复杂逻辑,可以结合其他工具(如 Cron、触发器、存储过程)一起使用以达到更好的效果。


八 补充:停机时段的 Event 怎么办

在 MySQL 中,Event Scheduler 的行为依赖于事件的定义和数据库的状态。对于停机期间未能执行的事件,其行为取决于事件的调度类型ON SCHEDULE)以及事件是否启用了“捕获遗漏”功能。

默认行为

  1. 单次事件(AT 定时事件)
    • 如果事件定义为在某个具体时间点(如 ON SCHEDULE AT '2025-01-15 08:00:00')执行,而在该时间点数据库关闭,事件将被跳过,永远不会再执行。
  2. 周期性事件(EVERY 定时事件)
    • 周期性事件不会追溯执行停机期间的错过时间点。它只会从数据库重新启动并启用事件调度器后,等待下一次触发时间来执行。
    • 例如:
      CREATE EVENT daily_task 
      ON SCHEDULE EVERY 1 DAY 
      STARTS '2025-01-14 08:00:00' 
      DO 
      DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY; 
      如果数据库在 8:00 停机,10:00 启动,那么当天的任务不会执行,事件将在次日 8:00 执行。

捕获遗漏功能(ON COMPLETION NOT PRESERVE)

MySQL 没有直接内置的“捕获遗漏任务”功能。换句话说,MySQL 不会检查事件是否在某个时间被跳过并追溯执行。但可以通过以下方式模拟此行为:

解决方案 1:使用事件逻辑自行检查未执行的时间点

通过在事件中实现检查逻辑,可以手动追溯未执行的任务。例如:

CREATE EVENT check_and_execute_missed_tasks 
ON SCHEDULE EVERY 1 DAY 
STARTS '2025-01-15 08:00:00' 
DO 
BEGIN 
    -- 检查是否有未处理的任务 
    IF NOT EXISTS (SELECT 1 FROM task_log WHERE task_date = CURDATE() - INTERVAL 1 DAY) 
    THEN 
        -- 执行任务 
        DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY; 
        -- 记录任务已执行 
        INSERT INTO task_log (task_date, status) VALUES (CURDATE() - INTERVAL 1 DAY, 'Executed'); 
    END IF; 
END; 
解决方案 2:在数据库重启后,手动检查并触发补偿
  • 在系统启动时执行补偿任务:

    ALL execute_missed_tasks(); 
  • 存储过程示例:

    DELIMITER $$ 
    CREATE PROCEDURE execute_missed_tasks() 
    BEGIN 
        DECLARE last_run_date DATE; 
        SET last_run_date = (SELECT MAX(task_date) FROM task_log); 
    
        WHILE last_run_date < CURDATE() DO 
            -- 执行补偿逻辑 
            DELETE FROM logs WHERE created_at < last_run_date - INTERVAL 30 DAY; 
            -- 记录补偿任务 
            INSERT INTO task_log (task_date, status) VALUES (last_run_date, 'Compensated'); 
            SET last_run_date = last_run_date + INTERVAL 1 DAY; 
        END WHILE; 
    END $$ 
    DELIMITER ; 
解决方案 3:结合外部调度工具

如果业务需要强一致性,建议配合外部工具(如 CronScheduler Framework)来管理错过的事件。


其他注意事项

  1. 确保 Event Scheduler 启用
    • 如果 MySQL 在重新启动后,event_scheduler 未启用,事件将不会执行。需要确保其状态为 ON
      SET GLOBAL event_scheduler = ON; 
  2. 检查事件状态
    • 查看是否有事件被禁用或未正常执行:
      SELECT EVENT_NAME, STATUS, LAST_EXECUTED 
      FROM INFORMATION_SCHEMA.EVENTS; 
  3. 记录日志
    • 为了跟踪事件执行情况,可以在事件中插入日志,便于分析错过的执行:
      INSERT INTO event_log (event_name, executed_at, status) 
      VALUES ('daily_task', NOW(), 'Success'); 

总结

  • 停机期间未执行的事件不会自动补偿。
  • 对于重要任务,可在事件逻辑中加入补偿机制,或者结合外部调度工具。
  • 定期监控事件状态和执行日志,确保任务按预期执行。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SOLID原则学习,接口隔离原则(Interface Segregation Principle, ISP)

文章目录 1. 定义2. 为什么要遵循接口隔离原则&#xff1f;3. 违反接口隔离原则的例子4. 遵循接口隔离原则的改进5. 总结 1. 定义 接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09; 接口隔离原则是面向对象设计中的五大原则&#xff08;SOLID&#…

浅谈云计算12 | KVM虚拟化技术

KVM虚拟化技术 一、KVM虚拟化技术基础1.1 KVM虚拟化技术简介1.2 KVM虚拟化技术架构1.2.1 KVM内核模块1.2.2 用户空间工具&#xff08;QEMU、Libvirt等&#xff09; 二、KVM虚拟化技术原理2.1 硬件辅助虚拟化2.2 VMCS结构与工作机制 三、KVM虚拟化技术面临的挑战与应对策略3.1 性…

unity如何在urp管线下合并spine的渲染批次

对于导入unity的spine来说,他会对每个spine生成独有的材质,虽然他们使用的是同一个shader,但由于附带独有的贴图,这样在项目使用中会由于材质贴图不同而导致无法合批. 而为什么选用urp,因为在built-in管线中,对于GPU-instancing,即使通过使用图集的方式统一了贴图,也会由于spi…

list的迭代器模拟实现和迭代器失效(续)

文章目录 list的迭代器operator->普通迭代器和const迭代器迭代器模版迭代器失效析构拷贝构造赋值重载 initializer_list list的迭代器 对迭代器进行封装&#xff0c;迭代器的指针还是4个字节&#xff0c;在物理上是一样的&#xff0c;但是底层是完全不同的 迭代器是浅拷贝&a…

一文通透OpenVLA及其源码剖析——基于Prismatic VLM(SigLIP、DinoV2、Llama 2)及离散化动作预测

前言 当对机器人动作策略的预测越来越成熟稳定之后(比如ACT、比如扩散策略diffusion policy)&#xff0c;为了让机器人可以拥有更好的泛化能力&#xff0c;比较典型的途径之一便是基于预训练过的大语言模型中的广泛知识&#xff0c;然后加一个policy head(当然&#xff0c;一开…

Easysearch Rollup 使用指南

背景 在现代数据驱动的世界中&#xff0c;时序数据的处理变得越来越重要。无论是监控系统、日志分析&#xff0c;还是物联网设备的数据收集&#xff0c;时序数据都占据了大量的存储空间。随着时间的推移&#xff0c;这些数据的存储成本和管理复杂度也在不断增加。 为了解决这…

FPGA EDA软件的位流验证

位流验证&#xff0c;对于芯片研发是一个非常重要的测试手段&#xff0c;对于纯软件开发人员&#xff0c;最难理解的就是位流验证。在FPGA芯片研发中&#xff0c;位流验证是在做什么&#xff0c;在哪些阶段需要做位流验证&#xff0c;如何做&#xff1f;都是问题。 我们先整体的…

[免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue新能源汽车充电桩管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue新能源汽车充电桩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息化时代的到来&#xff0…

如何选择多个视频文件

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何选择多个图片文件"相关的内容&#xff0c;本章回中将介绍如何选择视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在前…

闲谭SpringBoot--ShardingSphere分布式事务探究

文章目录 0. 背景1. 未分库分表时2. 仅分表时3. 分库分表时3.1 不涉及分库表3.2 涉及分库表&#xff0c;且分库表处于一个库3.3 涉及分库表&#xff0c;且分库表处于多个库3.4 涉及分库表&#xff0c;且运行中某库停机 4. 小结 0. 背景 接上篇文章《闲谭SpringBoot–ShardingS…

【20250113】基于肌肉形变测量的连续步态相位估计算法,可自适应步行速度和地形坡度...

【基本信息】 论文标题&#xff1a;Continuous Gait Phase Estimation by Muscle Deformations with Speed and Ramp Adaptability 发表期刊&#xff1a;IEEE Sensors Journal 发表时间&#xff1a;2024年5月30日 【访问链接】 论文链接&#xff1a;https://ieeexplore.ieee.or…

快速上手 HarmonyOS 应用开发

一、DevEco Studio 安装与配置 1. DevEco Studio 简介 DevEco Studio 是 HarmonyOS 的一站式集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了丰富的工具和功能&#xff0c;支持 HarmonyOS 应用开发的全流程。 2. DevEco Studio 下载与安装 下载地址&#xff1a…

Vue如何构建项目

目录 1.安装Node.js 2.换源(建议) 3.选择一个目录 4.创建一个vue项目 5.验证是否成功 1.安装Node.js 安装18.3或更⾼版本的 Nodejs 点击下载->Node.Js中文网 node -v npm -v 安装好后在windows的cmd窗口下运行 如果能运行出结果就说明安装好了。 2.换源(建议) //…

HTML拖拽功能(纯html5+JS实现)

1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…

初识算法和数据结构P1:保姆级图文详解

文章目录 前言1、算法例子1.1、查字典&#xff08;二分查找算法&#xff09;1.2、整理扑克&#xff08;插入排序算法&#xff09;1.3、货币找零&#xff08;贪心算法&#xff09; 2、算法与数据结构2.1、算法定义2.2、数据结构定义2.3、数据结构与算法的关系2.4、独立于编程语言…

Linux 多路径Multipath学习

文章目录 Linux 多路径Multipath学习1. 简介1.1 Multipath I/O 技术 2. Multipath安装与使用2.1 安装2.2 启动 3. scsi设备模拟器scsi_debug3.1 简介3.2 加载 scsi_debug3.3 查看 scsi_id3.4 配置多个模拟设备3.5 聚合多路径 4. 删除聚合和单设备4.1 删除mpath4.2 删除 scsi 设…

浅谈云计算06 | 云管理系统架构

云管理系统架构 一、云管理系统架构&#xff08;一&#xff09;远程管理系统&#xff08;二&#xff09;资源管理系统&#xff08;三&#xff09;SLA 管理系统&#xff08;四&#xff09;计费管理系统 二、安全与可靠性保障&#xff08;一&#xff09;数据安全防线&#xff08;…

Observability:利用 GCP Vertex AI 集成提升 LLM 可观察性

作者&#xff1a;来自 Elastic Ishleen Kaur•Muthukumar Paramasivam 随着组织越来越多地将 LLM 用于内容创建、检索增强生成 (Retrieval-Augmented Generation - RAG) 和数据分析等 AI 应用&#xff0c;SRE 和开发人员面临着新的挑战。监控工作流、分析输入和输出、管理查询延…

Node.js - Express框架

1. 介绍 Express 是一个基于 Node.js 的 Web 应用程序框架&#xff0c;主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一&#xff0c;具有轻量级、灵活和功能丰富的特点。 核心概念包括路由&#xff0c;中间件&#xff0c;请求与响应&a…

Linux Top 命令 load average 指标解读

前言 作为平台开发的同学&#xff0c;维护平台稳定性是我们最基本的工作职责&#xff0c;下面主要介绍下top 命令里 &#xff0c;load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载&#xff0c;它表示运…