MariaDB如何实现自动删除happened_at字段15天以上记录的功能?
MariaDB 定时清理15天前历史记录实现方案
一、前置配置:开启事件调度器
MariaDB事件功能默认处于关闭状态,需先开启才能正常执行定时任务:
- 检查调度器状态:
SHOW VARIABLES LIKE 'event_scheduler';
如果返回值为OFF,执行以下命令临时开启:
SET GLOBAL event_scheduler = ON;
- 永久生效配置:
修改数据库配置文件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
相关产品推荐
相关产品推荐

