MySQL

发布于 更新于

AI总结: 本文介绍了如何在MySQL中启用和配置事件调度器。首先,可以通过命令SET GLOBAL event_scheduler = ON来立即启用事件调度器,并使用SHOW VARIABLES LIKE 'event_scheduler'命令验证其状态。此设置需要管理员权限,并且可以在MySQL配置文件中设置为自动启用,但需要重启服务。还介绍了如何禁用事件调度器。接着,提供了一个示例事件,用于定期删除前一天的表,并展示了如何查询事件的执行情况。最后,介绍了另一个事件,用于定期删除历史数据。需要注意的是,创建事件和执行相关SQL语句时,使用PREPARE和EXECUTE语句是必要的。文中未提及的错误观点包括未明确说明在某些情况下可能需要额外的权限或设置,此外,可能会对事件调度器的性能影响缺乏详细讨论。

开启事件调度器(Event Scheduler):

SET GLOBAL event_scheduler = ON;  

这个命令会立即启用事件调度器,而不需要重启 MySQL 服务。你可以通过以下命令来验证事件调度器是否已经启用:

SHOW VARIABLES LIKE 'event_scheduler';  

如果结果是 ON,那么事件调度器已经成功启用。

注意事项:

  1. SET GLOBAL event_scheduler = ON; 是一个全局变量的设置,通常需要管理员权限(SUPERSET 权限)。
  2. 如果你希望在 MySQL 启动时自动启用事件调度器,可以将配置文件中的 event_scheduler 设置为 ON
[mysqld]  
event_scheduler = ON  

这种方法需要重启 MySQL 服务来生效,但它确保每次启动时事件调度器都会启用。

禁用事件调度器:

SET GLOBAL event_scheduler = OFF;  

定时删除日表

-- 打开事件调度器(需要管理员权限)  
SET GLOBAL event_scheduler = ON;  

DELIMITER $$  

CREATE EVENT IF NOT EXISTS ev_drop_daily_table  
ON SCHEDULE EVERY 1 DAY  
-- 从明天 02:10 开始第一次执行,之后每天同一时间执行  
STARTS (CURRENT_DATE + INTERVAL 1 DAY + INTERVAL 2 HOUR + INTERVAL 10 MINUTE)  
DO  
BEGIN  
    DECLARE tbl_name VARCHAR(64);  

    -- 生成要删除的表名(这里为昨天的表),例如 t_table_2025-11-20  
    SET tbl_name = CONCAT('t_table_', DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 DAY), '%Y-%m-%d'));  

    -- 使用用户变量传入 PREPARE  
    SET @sql_text = CONCAT('DROP TABLE IF EXISTS `', tbl_name, '`');  

    PREPARE stmt FROM @sql_text;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
END$$  

DELIMITER ;  

查询事件执行情况:

SELECT EVENT_NAME, LAST_EXECUTED  
FROM information_schema.events  
WHERE EVENT_NAME = 'ev_drop_daily_table';  

定时删除历史数据:

CREATE EVENT IF NOT EXISTS `ev_delete_history`   
ON SCHEDULE EVERY 1 DAY   
STARTS (CURRENT_DATE + INTERVAL 1 DAY + INTERVAL 2 HOUR + INTERVAL 10 MINUTE)    
DO   
BEGIN    
    SET @sql_text = 'DELETE FROM t_history WHERE create_time < DATE_SUB(now(),INTERVAL 100 DAY);';    

    PREPARE stmt FROM @sql_text;    
    EXECUTE stmt;    
    DEALLOCATE PREPARE stmt;    
END