在mysql中我们可以可以通过 事件调度器 (Event Scheduler) ,让MySQL定时为我们执行一些任务。
例如:
在 MySQL 中实现每天凌晨0点定时清空指定的test表,并在一个月后自动停止该定时任务。以下是完整步骤:
默认情况下事件调度器可能关闭,需手动启用:
-- 临时启用(重启失效)
SET GLOBAL event_scheduler = ON;
-- 永久启用(修改配置文件)
-- 在 my.cnf 或 my.ini 的 [mysqld] 下添加:
event_scheduler = ON验证是否启用:
SHOW VARIABLES LIKE 'event_scheduler';
-- 输出应为 ON创建每天凌晨0点清空 test 表的事件,并在一个月后自动停止:
DELIMITER //
CREATE EVENT `auto_truncate_test`
ON SCHEDULE
EVERY 1 DAY
STARTS CURRENT_DATE + INTERVAL 1 DAY -- 从明天开始
ENDS CURRENT_DATE + INTERVAL 1 MONTH + INTERVAL 1 DAY -- 一个月后停止
DO
BEGIN
TRUNCATE TABLE test; -- 清空表(比 DELETE 更高效)
END //
DELIMITER ;-- 查看事件是否创建成功
SHOW EVENTS LIKE 'auto_truncate_test';
-- 查看事件下次执行时间
SELECT
EVENT_NAME,
LAST_EXECUTED,
NEXT_EXECUTED,
STATUS
FROM information_schema.EVENTS
WHERE EVENT_NAME = 'auto_truncate_test';-- 立即停止事件
ALTER EVENT `auto_truncate_test` DISABLE;
-- 重新启用事件
ALTER EVENT `auto_truncate_test` ENABLE;
-- 删除事件(一个月后无需手动操作,事件到期自动禁用)
DROP EVENT IF EXISTS `auto_truncate_test`;STARTS:定义事件首次执行时间(CURRENT_DATE + INTERVAL 1 DAY 表示次日凌晨)。ENDS:事件自动停止的时间(一个月后结束)。TRUNCATE 而非 DELETE :TRUNCATE 会直接删除表数据并重置自增 ID,效率更高且不记录逐行删除日志。EVENT 权限才能创建和管理事件。 -- 查看时区
SELECT @@global.time_zone, @@session.time_zone;
-- 设置时区(例如东八区)
SET GLOBAL time_zone = '+8:00';ENDS 时间后,事件会自动变为 DISABLED 状态,但不会删除,需手动清理。为避免误删数据,可先备份数据再清空:
DELIMITER //
CREATE EVENT `auto_truncate_test_with_backup`
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_DATE + INTERVAL 1 DAY
ENDS CURRENT_DATE + INTERVAL 1 MONTH + INTERVAL 1 DAY
DO
BEGIN
-- 创建备份表(例如 test_backup_20231001)
SET @backup_table = CONCAT('test_backup_', DATE_FORMAT(NOW(), '%Y%m%d'));
SET @sql = CONCAT('CREATE TABLE ', @backup_table, ' SELECT * FROM test');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 清空原表
TRUNCATE TABLE test;
END //
DELIMITER ;通过 MySQL 事件调度器,可以为我们处理一些需要定时执行的任务。务必注意:
STARTS 和 ENDS 时间。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。