在 MySQL 中自动删除三天前的数据,通常可以通过 事件调度器(Event Scheduler) 来实现。以下是详细步骤:
步骤 1:确保事件调度器已启用
MySQL 默认可能未开启事件调度器。先检查状态:
SHOW VARIABLES LIKE 'event_scheduler';
如果返回 ON,说明已启用。
如果是 OFF,则需要开启:
SET GLOBAL event_scheduler = ON;
注意:该设置在 MySQL 重启后会失效。如需永久生效,请在配置文件(如 my.cnf 或 my.ini)中添加:
[mysqld]
event_scheduler=ON
步骤 2:创建自动删除数据的事件
假设你有一张表 logs,其中有一个时间字段 create_time(类型为 DATETIME 或 TIMESTAMP),你想每天自动删除 3 天前 的数据。
执行以下 SQL 创建事件:
CREATE EVENT IF NOT EXISTS delete_old_logs
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP
DO
DELETE FROM logs WHERE create_time < NOW() - INTERVAL 3 DAY;
说明:
EVERY 1 DAY:每天执行一次。
STARTS CURRENT_TIMESTAMP:从当前时间开始(也可以指定具体时间,如 ‘2025-11-29 02:00:00’)。
NOW() - INTERVAL 3 DAY:表示当前时间减去 3 天。
事件名为 delete_old_logs,可自定义。
步骤 3(可选):查看或管理事件
查看所有事件,使用 SHOW EVENTS 语句(最常用)
SHOW EVENTS;
这会列出当前默认数据库中的所有事件。如果你没有先使用 USE your_database; 指定数据库,可能看不到任何事件。
指定数据库查看事件:
SHOW EVENTS FROM your_database_name;
-- 或
SHOW EVENTS IN your_database_name;
示例:
SHOW EVENTS FROM myapp_db;
或者查询 information_schema.EVENTS 系统表,这是更灵活、详细的方式,可以跨库查询:
SELECT
EVENT_SCHEMA AS database_name,
EVENT_NAME AS event_name,
EVENT_DEFINITION AS definition,
EVENT_TYPE AS type, -- ONE TIME or RECURRING
EXECUTE_AT, -- 一次性事件的执行时间
INTERVAL_VALUE, -- 重复间隔值
INTERVAL_FIELD, -- 重复间隔单位(如 DAY, HOUR)
STATUS, -- ENABLED / DISABLED / SLAVESIDE_DISABLED
STARTS,
ENDS,
LAST_EXECUTED,
CREATED
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'your_database_name'; -- 可选:过滤特定库
如果你想查看所有数据库的事件,去掉 WHERE 子句即可:
SELECT EVENT_SCHEMA, EVENT_NAME, STATUS, EVENT_DEFINITION
FROM information_schema.EVENTS;
删除事件(如果需要):
DROP EVENT delete_old_logs;
修改事件(如调整保留天数):
先 DROP 再重新 CREATE,或使用 ALTER EVENT(但 ALTER 不能修改 DO 体,通常建议重建)。
注意事项
时间字段必须是日期/时间类型(如 DATETIME, TIMESTAMP)。
确保有索引:在 create_time 字段上建立索引,否则大表删除会很慢甚至锁表。
CREATE INDEX idx_create_time ON logs(create_time);
测试语句:先手动运行 DELETE 语句确认逻辑正确,避免误删。
权限要求:用户需要有 EVENT 权限和对应表的 DELETE 权限。
1349

被折叠的 条评论
为什么被折叠?



