在mysql数据库的日常使用中,业务产生的历史旧数据如果长期不清理,会不断占用磁盘空间,同时也会影响数据查询和写入的效率。通过存储过程封装清理逻辑,再结合EVENT事件调度器设置定时触发规则,就能实现旧数据的自动化清理,无需人工频繁操作。

创建用于清理旧数据的存储过程
首先我们需要创建一个存储过程,把清理旧数据的逻辑封装在里面。假设我们有一张名为user_log的日志表,表中包含id、log_content、create_time字段,我们需要清理30天前的日志数据。
创建存储过程的代码如下:
-- 如果存储过程已存在则先删除
DROP PROCEDURE IF EXISTS clean_old_user_log;
-- 修改语句结束符,避免和存储过程中的分号冲突
DELIMITER //
-- 创建存储过程
CREATE PROCEDURE clean_old_user_log()
BEGIN
-- 定义变量,记录清理前的数据量
DECLARE before_count INT;
-- 定义变量,记录清理后的数据量
DECLARE after_count INT;
-- 查询清理前的数据总量
SELECT COUNT(*) INTO before_count FROM user_log WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 执行清理操作,删除30天前的日志
DELETE FROM user_log WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 查询清理后的数据总量
SELECT COUNT(*) INTO after_count FROM user_log WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 输出清理结果
SELECT CONCAT('清理前旧数据量:', before_count, ',清理后旧数据量:', after_count, ',本次清理数据量:', before_count - after_count) AS clean_result;
END //
-- 恢复默认语句结束符
DELIMITER ;
上述存储过程的逻辑是先统计需要清理的旧数据数量,然后执行删除操作,最后输出清理的结果,方便我们确认清理是否生效。
配置EVENT事件调度器
存储过程创建完成后,我们需要通过EVENT事件调度器来设置定时触发规则,让存储过程按照我们指定的时间自动执行。
开启EVENT调度器功能
mysql默认可能没有开启EVENT调度器,我们需要先检查并开启该功能:
-- 查看EVENT调度器状态 SHOW VARIABLES LIKE 'event_scheduler'; -- 如果状态是OFF,执行以下语句开启 SET GLOBAL event_scheduler = ON;
注意开启操作需要管理员权限,如果是永久开启,还需要修改mysql的配置文件,在[mysqld]节点下添加event_scheduler=ON,然后重启mysql服务。
创建定时触发EVENT
接下来创建EVENT,设置每天凌晨2点自动执行我们刚才创建的存储过程:
-- 如果EVENT已存在则先删除
DROP EVENT IF EXISTS ev_clean_old_log;
-- 创建EVENT
CREATE EVENT ev_clean_old_log
-- 设置执行周期,每天执行一次
ON SCHEDULE EVERY 1 DAY
-- 第一次执行的时间,设置为明天凌晨2点
STARTS TIMESTAMP(CURRENT_DATE, '02:00:00') + INTERVAL 1 DAY
-- 事件执行的内容
DO
-- 调用存储过程
CALL clean_old_user_log();
如果我们希望EVENT只执行一次,而不是周期性执行,可以修改ON SCHEDULE的配置:
-- 只执行一次的EVENT,在指定时间执行
CREATE EVENT ev_clean_old_log_once
ON SCHEDULE AT TIMESTAMP(CURRENT_DATE, '02:00:00') + INTERVAL 1 DAY
DO
CALL clean_old_user_log();
验证清理效果
我们可以手动调用一次存储过程,验证清理逻辑是否正常:
-- 手动调用存储过程 CALL clean_old_user_log();
执行后会返回清理的数据量结果,我们可以再查询user_log表,确认30天前的数据是否已经被删除:
-- 查询是否还有30天前的日志 SELECT COUNT(*) FROM user_log WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY);
如果返回结果为0,说明清理逻辑正常。之后EVENT会在设置的时间自动触发存储过程,实现定时清理。
注意事项
- 删除数据前建议先做好数据备份,避免误删重要数据无法恢复。
- 如果清理的数据量较大,建议在业务低峰期执行,避免影响正常业务运行。
- 可以通过
SHOW EVENTS;语句查看所有EVENT的状态,确认EVENT是否处于启用状态。 - 如果不需要某个EVENT,可以使用
DROP EVENT 事件名;语句删除,避免不必要的资源消耗。
mysql存储过程EVENT事件调度器定时清理数据修改时间:2026-07-13 01:00:25