MySQL 事件调度器速查核心语法与实战代码MySQL 事件调度器 Event Scheduler 是一个强大的数据库任务执行工具能够让你定时执行 SQL 脚本这在数据库维护、数据清理等场景中非常有用。这篇速查手册通过几个具体问题直接告诉你如何使用 MySQL 事件调度器帮助你快速上手。问题1如何启用和禁用 MySQL 事件调度器启用或禁用 MySQL 事件调度器非常简单只需要通过设置event_scheduler系统变量即可。启用事件调度器SET GLOBAL event_scheduler ON;禁用事件调度器SET GLOBAL event_scheduler OFF;查看当前事件调度器状态SHOW VARIABLES LIKE event_scheduler;问题2如何创建一个简单的定时任务创建一个简单的定时任务可以使用CREATE EVENT语句。下面的示例创建一个每分钟执行一次的事件将logs表中的所有数据删除。-- 创建一个每分钟执行一次的事件 CREATE EVENT clear_logs ON SCHEDULE EVERY 1 MINUTE DO DELETE FROM logs;问题3如何创建一个定时任务但只在特定时间执行如果你希望定时任务在特定时间执行可以使用AT关键字。下面的示例创建一个事件将在 2023-10-01 00:00:00 执行删除users表中所有 30 天未登录的用户。-- 创建一个在特定时间执行的事件 CREATE EVENT purge_inactive_users ON SCHEDULE AT 2023-10-01 00:00:00 DO DELETE FROM users WHERE last_login DATE_SUB(NOW(), INTERVAL 30 DAY);问题4如何创建一个定时任务但只执行一次创建一个只执行一次的定时任务可以使用AT关键字。下面的示例创建一个事件将在 10 分钟后执行向notifications表中插入一条通知。-- 创建一个只执行一次的事件 CREATE EVENT send_notification ON SCHEDULE AT CURRENT_TIMESTAMP INTERVAL 10 MINUTE DO INSERT INTO notifications (message, created_at) VALUES (提醒任务即将到期, NOW());问题5如何创建一个定时任务按照自定义的时间间隔执行创建一个按照自定义时间间隔执行的定时任务可以使用EVERY关键字。下面的示例创建一个每 5 小时执行一次的事件更新orders表中的订单状态。-- 创建一个每 5 小时执行一次的事件 CREATE EVENT update_order_status ON SCHEDULE EVERY 5 HOUR DO UPDATE orders SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR);问题6如何修改已经创建的定时任务修改已经创建的定时任务可以使用ALTER EVENT语句。下面的示例将修改clear_logs事件的执行频率为每 5 分钟一次。-- 修改已经创建的事件 ALTER EVENT clear_logs ON SCHEDULE EVERY 5 MINUTE;问题7如何查看和删除已存在的事件查看已存在的事件可以使用SHOW EVENTS语句。删除事件则使用DROP EVENT语句。查看已存在的事件SHOW EVENTS;删除已存在的事件DROP EVENT clear_logs;问题8如何创建一个定时任务确保任务失败后重试确保任务失败后重试可以使用ON COMPLETION和STARTS关键字。下面的示例创建一个事件每 10 分钟执行一次如果任务失败会在 1 分钟后重试。-- 创建一个确保任务失败后重试的事件 CREATE EVENT backup_database ON SCHEDULE EVERY 10 MINUTE STARTS CURRENT_TIMESTAMP INTERVAL 1 MINUTE ON COMPLETION PRESERVE DO CALL backup_db_procedure();注释说明ON COMPLETION PRESERVE确保事件在完成或失败后仍然存在不会自动删除。STARTS CURRENT_TIMESTAMP INTERVAL 1 MINUTE在当前时间 1 分钟后开始执行。问题9如何创建一个定时任务只在特定日期范围内执行创建一个只在特定日期范围内执行的定时任务可以使用ON SCHEDULE和ENDS关键字。下面的示例创建一个事件从 2023-10-01 00:00:00 开始到 2023-12-31 23:59:59 结束每 24 小时执行一次清理temp_data表中的临时数据。-- 创建一个在特定日期范围内执行的事件 CREATE EVENT cleanup_temp_data ON SCHEDULE EVERY 24 HOUR STARTS 2023-10-01 00:00:00 ENDS 2023-12-31 23:59:59 DO DELETE FROM temp_data WHERE created_at DATE_SUB(NOW(), INTERVAL 7 DAY);注释说明STARTS和ENDS指定事件的开始和结束时间。问题10如何创建一个定时任务同时启用和禁用创建一个定时任务时可以同时启用或禁用它。下面的示例创建一个事件并立即启用它。-- 创建并立即启用的事件 CREATE EVENT update_inventory ON SCHEDULE EVERY 12 HOUR DO CALL update_inventory_procedure() ENABLE;注释说明ENABLE立即启用事件使其开始执行。问题11如何处理定时任务中的错误处理定时任务中的错误可以在事件中使用BEGIN ... END块并结合DECLARE HANDLER语句。下面的示例创建一个事件每 15 分钟执行一次如果发生错误记录错误信息到errors表中。-- 创建一个处理错误的事件 CREATE EVENT process_data ON SCHEDULE EVERY 15 MINUTE DO BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN INSERT INTO errors (error_message, created_at) VALUES (CONCAT(处理数据时发生错误, NOW()), NOW()); END; -- 执行业务逻辑 CALL process_data_procedure(); END;注释说明DECLARE CONTINUE HANDLER FOR SQLEXCEPTION定义一个错误处理程序当发生 SQL 异常时继续执行。INSERT INTO errors记录错误信息到errors表中。问题12如何确保定时任务在数据库重启后仍然有效确保定时任务在数据库重启后仍然有效可以使用ON COMPLETION PRESERVE和EVENT表中的status列。下面的示例创建一个事件并确保其在数据库重启后仍然存在。-- 创建并确保重启后仍然存在的事件 CREATE EVENT daily_report ON SCHEDULE EVERY 1 DAY ON COMPLETION PRESERVE DO CALL generate_daily_report();注释说明ON COMPLETION PRESERVE确保事件在完成或失败后仍然存在不会自动删除。问题13如何查看事件的详细信息查看事件的详细信息可以使用SHOW CREATE EVENT语句。下面的示例查看clear_logs事件的详细信息。-- 查看事件的详细信息 SHOW CREATE EVENT clear_logs;问题14如何创建一个定时任务同时设置多个条件创建一个定时任务时可以设置多个条件如开始时间、结束时间、执行频率等。下面的示例创建一个事件从 2023-10-01 00:00:00 开始到 2023-12-31 23:59:59 结束每 1 小时执行一次更新user_activity表中的用户活动数据。-- 创建一个设置多个条件的事件 CREATE EVENT update_user_activity ON SCHEDULE EVERY 1 HOUR STARTS 2023-10-01 00:00:00 ENDS 2023-12-31 23:59:59 DO UPDATE user_activity SET active 0 WHERE last_seen DATE_SUB(NOW(), INTERVAL 7 DAY);注释说明STARTS和ENDS指定事件的开始和结束时间。EVERY 1 HOUR每 1 小时执行一次。问题15如何创建一个定时任务同时执行多个 SQL 语句创建一个定时任务同时执行多个 SQL 语句可以使用BEGIN ... END块。下面的示例创建一个事件每 12 小时执行一次清理logs表中 30 天前的数据并记录清理操作到cleanup_records表中。-- 创建一个同时执行多个 SQL 语句的事件 CREATE EVENT cleanup_logs_and_record ON SCHEDULE EVERY 12 HOUR DO BEGIN -- 清理 logs 表 DELETE FROM logs WHERE created_at DATE_SUB(NOW(), INTERVAL 30 DAY); -- 记录清理操作 INSERT INTO cleanup_records (table_name, action, created_at) VALUES (logs, 清理 30 天前的数据, NOW()); END;问题16如何创建一个定时任务只在工作日执行创建一个定时任务只在工作日执行可以使用EVERY关键字结合MODIFIES子句。下面的示例创建一个事件每 24 小时执行一次但只在周一到周五执行更新sales表中的销售数据。-- 创建一个只在工作日执行的事件 CREATE EVENT update_sales ON SCHEDULE EVERY 24 HOUR STARTS 2023-10-01 00:00:00 DO CASE DAYOFWEEK(NOW()) WHEN 2 THEN -- 周一 UPDATE sales SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR); WHEN 3 THEN -- 周二 UPDATE sales SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR); WHEN 4 THEN -- 周三 UPDATE sales SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR); WHEN 5 THEN -- 周四 UPDATE sales SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR); WHEN 6 THEN -- 周五 UPDATE sales SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR); END CASE;注释说明DAYOFWEEK(NOW())返回当前日期是一周中的哪一天1 表示周日2 表示周一以此类推。CASE语句根据当前日期是工作日中的哪一天执行相应的更新操作。结尾推荐如果你在处理定时任务时遇到复杂的调度需求不妨试试 Hey Cron。Hey Cron 是一个免费的在线工具网站提供了多种实用功能包括Cron 表达式生成器中文描述秒转 Cron 表达式轻松生成复杂的定时任务表达式。正则表达式生成器帮助你快速生成和测试正则表达式。中英互译方便你进行中英文翻译。JSON 格式化美化和验证 JSON 格式。Base64 编码解码轻松进行 Base64 编码和解码操作。时间戳转换方便你进行时间戳与日期时间的转换。JWT 解析解析和验证 JWT 令牌。这些工具能够大大提升你的开发效率值得一试
MySQL 事件调度器速查:核心语法与实战代码
发布时间:2026/6/1 20:01:05
MySQL 事件调度器速查核心语法与实战代码MySQL 事件调度器 Event Scheduler 是一个强大的数据库任务执行工具能够让你定时执行 SQL 脚本这在数据库维护、数据清理等场景中非常有用。这篇速查手册通过几个具体问题直接告诉你如何使用 MySQL 事件调度器帮助你快速上手。问题1如何启用和禁用 MySQL 事件调度器启用或禁用 MySQL 事件调度器非常简单只需要通过设置event_scheduler系统变量即可。启用事件调度器SET GLOBAL event_scheduler ON;禁用事件调度器SET GLOBAL event_scheduler OFF;查看当前事件调度器状态SHOW VARIABLES LIKE event_scheduler;问题2如何创建一个简单的定时任务创建一个简单的定时任务可以使用CREATE EVENT语句。下面的示例创建一个每分钟执行一次的事件将logs表中的所有数据删除。-- 创建一个每分钟执行一次的事件 CREATE EVENT clear_logs ON SCHEDULE EVERY 1 MINUTE DO DELETE FROM logs;问题3如何创建一个定时任务但只在特定时间执行如果你希望定时任务在特定时间执行可以使用AT关键字。下面的示例创建一个事件将在 2023-10-01 00:00:00 执行删除users表中所有 30 天未登录的用户。-- 创建一个在特定时间执行的事件 CREATE EVENT purge_inactive_users ON SCHEDULE AT 2023-10-01 00:00:00 DO DELETE FROM users WHERE last_login DATE_SUB(NOW(), INTERVAL 30 DAY);问题4如何创建一个定时任务但只执行一次创建一个只执行一次的定时任务可以使用AT关键字。下面的示例创建一个事件将在 10 分钟后执行向notifications表中插入一条通知。-- 创建一个只执行一次的事件 CREATE EVENT send_notification ON SCHEDULE AT CURRENT_TIMESTAMP INTERVAL 10 MINUTE DO INSERT INTO notifications (message, created_at) VALUES (提醒任务即将到期, NOW());问题5如何创建一个定时任务按照自定义的时间间隔执行创建一个按照自定义时间间隔执行的定时任务可以使用EVERY关键字。下面的示例创建一个每 5 小时执行一次的事件更新orders表中的订单状态。-- 创建一个每 5 小时执行一次的事件 CREATE EVENT update_order_status ON SCHEDULE EVERY 5 HOUR DO UPDATE orders SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR);问题6如何修改已经创建的定时任务修改已经创建的定时任务可以使用ALTER EVENT语句。下面的示例将修改clear_logs事件的执行频率为每 5 分钟一次。-- 修改已经创建的事件 ALTER EVENT clear_logs ON SCHEDULE EVERY 5 MINUTE;问题7如何查看和删除已存在的事件查看已存在的事件可以使用SHOW EVENTS语句。删除事件则使用DROP EVENT语句。查看已存在的事件SHOW EVENTS;删除已存在的事件DROP EVENT clear_logs;问题8如何创建一个定时任务确保任务失败后重试确保任务失败后重试可以使用ON COMPLETION和STARTS关键字。下面的示例创建一个事件每 10 分钟执行一次如果任务失败会在 1 分钟后重试。-- 创建一个确保任务失败后重试的事件 CREATE EVENT backup_database ON SCHEDULE EVERY 10 MINUTE STARTS CURRENT_TIMESTAMP INTERVAL 1 MINUTE ON COMPLETION PRESERVE DO CALL backup_db_procedure();注释说明ON COMPLETION PRESERVE确保事件在完成或失败后仍然存在不会自动删除。STARTS CURRENT_TIMESTAMP INTERVAL 1 MINUTE在当前时间 1 分钟后开始执行。问题9如何创建一个定时任务只在特定日期范围内执行创建一个只在特定日期范围内执行的定时任务可以使用ON SCHEDULE和ENDS关键字。下面的示例创建一个事件从 2023-10-01 00:00:00 开始到 2023-12-31 23:59:59 结束每 24 小时执行一次清理temp_data表中的临时数据。-- 创建一个在特定日期范围内执行的事件 CREATE EVENT cleanup_temp_data ON SCHEDULE EVERY 24 HOUR STARTS 2023-10-01 00:00:00 ENDS 2023-12-31 23:59:59 DO DELETE FROM temp_data WHERE created_at DATE_SUB(NOW(), INTERVAL 7 DAY);注释说明STARTS和ENDS指定事件的开始和结束时间。问题10如何创建一个定时任务同时启用和禁用创建一个定时任务时可以同时启用或禁用它。下面的示例创建一个事件并立即启用它。-- 创建并立即启用的事件 CREATE EVENT update_inventory ON SCHEDULE EVERY 12 HOUR DO CALL update_inventory_procedure() ENABLE;注释说明ENABLE立即启用事件使其开始执行。问题11如何处理定时任务中的错误处理定时任务中的错误可以在事件中使用BEGIN ... END块并结合DECLARE HANDLER语句。下面的示例创建一个事件每 15 分钟执行一次如果发生错误记录错误信息到errors表中。-- 创建一个处理错误的事件 CREATE EVENT process_data ON SCHEDULE EVERY 15 MINUTE DO BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN INSERT INTO errors (error_message, created_at) VALUES (CONCAT(处理数据时发生错误, NOW()), NOW()); END; -- 执行业务逻辑 CALL process_data_procedure(); END;注释说明DECLARE CONTINUE HANDLER FOR SQLEXCEPTION定义一个错误处理程序当发生 SQL 异常时继续执行。INSERT INTO errors记录错误信息到errors表中。问题12如何确保定时任务在数据库重启后仍然有效确保定时任务在数据库重启后仍然有效可以使用ON COMPLETION PRESERVE和EVENT表中的status列。下面的示例创建一个事件并确保其在数据库重启后仍然存在。-- 创建并确保重启后仍然存在的事件 CREATE EVENT daily_report ON SCHEDULE EVERY 1 DAY ON COMPLETION PRESERVE DO CALL generate_daily_report();注释说明ON COMPLETION PRESERVE确保事件在完成或失败后仍然存在不会自动删除。问题13如何查看事件的详细信息查看事件的详细信息可以使用SHOW CREATE EVENT语句。下面的示例查看clear_logs事件的详细信息。-- 查看事件的详细信息 SHOW CREATE EVENT clear_logs;问题14如何创建一个定时任务同时设置多个条件创建一个定时任务时可以设置多个条件如开始时间、结束时间、执行频率等。下面的示例创建一个事件从 2023-10-01 00:00:00 开始到 2023-12-31 23:59:59 结束每 1 小时执行一次更新user_activity表中的用户活动数据。-- 创建一个设置多个条件的事件 CREATE EVENT update_user_activity ON SCHEDULE EVERY 1 HOUR STARTS 2023-10-01 00:00:00 ENDS 2023-12-31 23:59:59 DO UPDATE user_activity SET active 0 WHERE last_seen DATE_SUB(NOW(), INTERVAL 7 DAY);注释说明STARTS和ENDS指定事件的开始和结束时间。EVERY 1 HOUR每 1 小时执行一次。问题15如何创建一个定时任务同时执行多个 SQL 语句创建一个定时任务同时执行多个 SQL 语句可以使用BEGIN ... END块。下面的示例创建一个事件每 12 小时执行一次清理logs表中 30 天前的数据并记录清理操作到cleanup_records表中。-- 创建一个同时执行多个 SQL 语句的事件 CREATE EVENT cleanup_logs_and_record ON SCHEDULE EVERY 12 HOUR DO BEGIN -- 清理 logs 表 DELETE FROM logs WHERE created_at DATE_SUB(NOW(), INTERVAL 30 DAY); -- 记录清理操作 INSERT INTO cleanup_records (table_name, action, created_at) VALUES (logs, 清理 30 天前的数据, NOW()); END;问题16如何创建一个定时任务只在工作日执行创建一个定时任务只在工作日执行可以使用EVERY关键字结合MODIFIES子句。下面的示例创建一个事件每 24 小时执行一次但只在周一到周五执行更新sales表中的销售数据。-- 创建一个只在工作日执行的事件 CREATE EVENT update_sales ON SCHEDULE EVERY 24 HOUR STARTS 2023-10-01 00:00:00 DO CASE DAYOFWEEK(NOW()) WHEN 2 THEN -- 周一 UPDATE sales SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR); WHEN 3 THEN -- 周二 UPDATE sales SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR); WHEN 4 THEN -- 周三 UPDATE sales SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR); WHEN 5 THEN -- 周四 UPDATE sales SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR); WHEN 6 THEN -- 周五 UPDATE sales SET status 已处理 WHERE created_at DATE_SUB(NOW(), INTERVAL 24 HOUR); END CASE;注释说明DAYOFWEEK(NOW())返回当前日期是一周中的哪一天1 表示周日2 表示周一以此类推。CASE语句根据当前日期是工作日中的哪一天执行相应的更新操作。结尾推荐如果你在处理定时任务时遇到复杂的调度需求不妨试试 Hey Cron。Hey Cron 是一个免费的在线工具网站提供了多种实用功能包括Cron 表达式生成器中文描述秒转 Cron 表达式轻松生成复杂的定时任务表达式。正则表达式生成器帮助你快速生成和测试正则表达式。中英互译方便你进行中英文翻译。JSON 格式化美化和验证 JSON 格式。Base64 编码解码轻松进行 Base64 编码和解码操作。时间戳转换方便你进行时间戳与日期时间的转换。JWT 解析解析和验证 JWT 令牌。这些工具能够大大提升你的开发效率值得一试