You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB如何实现自动删除happened_at字段15天以上记录的功能?

MariaDB 定时清理15天前历史记录实现方案

一、前置配置:开启事件调度器

MariaDB事件功能默认处于关闭状态,需先开启才能正常执行定时任务:

  1. 检查调度器状态:
SHOW VARIABLES LIKE 'event_scheduler';

如果返回值为OFF,执行以下命令临时开启:

SET GLOBAL event_scheduler = ON;
  1. 永久生效配置:
    修改数据库配置文件my.cnf(Linux)或my.ini(Windows),在[mysqld]段落添加以下配置,重启数据库后永久生效:
[mysqld]
event_scheduler = ON

二、事件代码修正

你原有代码存在两个可调整点:

  • 调度规则为EVERY 15 DAY时,任务每15天才执行一次,会导致超期数据最长延迟15天才能被清理,和注释里的「凌晨1点执行」的预期不符
  • 表结构含deleted软删除标记字段,可根据业务需求选择硬删(直接删除记录)或软删(标记删除状态)

版本1:每天凌晨1点执行,硬删除记录

CREATE EVENT IF NOT EXISTS `clean_older_than_15_days_logs`
ON SCHEDULE
  EVERY 1 DAY
  STARTS DATE_ADD(CURDATE(), INTERVAL 1 DAY + 1 HOUR) -- 首次执行时间为明天凌晨1点,之后每天一次
  COMMENT '清理log表中15天前的历史记录'
  DO
    DELETE FROM log
    WHERE happened_at < DATE_SUB(NOW(), INTERVAL 15 DAY);

版本2:每天凌晨1点执行,软删除标记

如果业务要求保留删除记录仅标记状态,使用以下逻辑:

CREATE EVENT IF NOT EXISTS `clean_older_than_15_days_logs`
ON SCHEDULE
  EVERY 1 DAY
  STARTS DATE_ADD(CURDATE(), INTERVAL 1 DAY + 1 HOUR)
  COMMENT '标记log表中15天前的历史记录为已删除'
  DO
    UPDATE log
    SET deleted = 1
    WHERE happened_at < DATE_SUB(NOW(), INTERVAL 15 DAY) AND deleted = 0;

如果确实需要每15天执行一次,把EVERY 1 DAY改为EVERY 15 DAY即可。

三、验证与注意事项

  • 执行创建语句后,可通过以下命令确认事件创建成功:
SHOW EVENTS FROM 你的数据库名 LIKE 'clean_older_than_15_days_logs';
  • 建议给happened_at字段添加普通索引,避免数据量大时清理操作扫描全表导致性能卡顿
  • 若首次清理前存量超期数据过多,建议先手动分批删除,避免定时任务执行时长过长锁表影响业务

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:42:03