mysql定时计划任务,ON COMPLETION [NOT] PRESERVE 当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而声明PRESERVE的作用是使事件在执行完毕后不会...

本文详细介绍了MySQL事件调度器的工作原理及配置方法,包括ONCOMPLETION参数的两种设置方式:PRESERVE与NOT PRESERVE的区别,以及如何确保事件调度器在MySQL服务重启后仍能保持运行状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当为on completion preserve 的时候,当event到期了,event会被disable,但是该event还是会存在
当为on completion not preserve的时候,当event到期的时候,该event会被自动删除掉.

[ON COMPLETION [NOT] PRESERVE] 
ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被Drop掉,建议使用该参数,以便于查看EVENT具体信息。


create event test
ON SCHEDULE AT '2007-09-01 12:00:00' + INTERVAL 1 DAY
on completion not preserve 
do insert into yyy values('hhh','uuu');

解释:从2007-09-01开始,每天对表yyy在12:00:00进行一个插入操作。而且只执行一次(on completion not preserve )

 

ON COMPLETION [NOT] PRESERVE 当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而声明PRESERVE的作用是使事件在执行完毕后不会被Drop掉 

提醒:虽然这里用set global event_scheduler = on语句开启了事件,但是每次重启电脑。或重启mysql服务后,会发现,事件自动关闭(event_scheduler=OFF),所以想让事件一直保持开启,最好修改配置文件,让mysql服务启动的时候开启时间,只需要在my.ini配置文件的[mysqld]部分加上event_scheduler=ON 即可,如下:
真实的开发环境中,会遇到mysql服务重启或者断电的情况,此时则会出现事件调度器被关闭的情况,所有事件都不在起作用,要想解决这个办法,则需要在mysql.ini文件中加入event_scheduler = ON; 的语句


http://bugs.mysql.com/bug.php?id=37666
<think>好的,我现在需要帮助用户了解如何在MySQL中创建定时作业,也就是事件(Events)。用户之前已经询问过如何查询现有的事件,所以现在他们可能想进一步学习如何创建自己的定时任务。接下来我要确保回答准确且符合他们的需求。 首先,我应该回顾用户的历史问题,他们之前询问的是查询MySQL事件的语句,现在转向创建,这说明用户可能正在学习工作中需要自动化某些数据库任务。我需要确保覆盖创建事件的基本语法、必要的权限以及常见的示例,这样用户可以立即应用。 用户可能想知道创建事件的基本步骤,比如需要哪些权限、如何启用事件调度器,以及如何编写事件执行语句和时间计划。此外,他们可能对不同的调度类型感兴趣,比如一次性执行重复执行,还有可能需要处理错误处理禁用事件的情况。 我需要考虑到用户可能不熟悉事件调度器的概念,所以在回答中需要解释如何启用它,并提醒权限问题。同时,给出具体的示例会很有帮助,比如每天执行一次、每小时执行等,这样用户可以直接修改示例来适应自己的需求。 另外,用户可能想知道如何验证事件是否创建成功,所以需要提到使用之前教过的SHOW EVENTS查询information_schema.EVENTS表的方法。可能还需要注意事项,比如事件的状态(启用禁用)、时区问题,以及事件执行失败时的处理方式。 需要确保回答结构清晰,分步骤讲解,并提供多个示例,涵盖不同的使用场景。同时,提醒用户关于权限和事件调度器状态的重要性,避免他们遇到常见的配置问题。 最后,检查是否有遗漏的部分,比如如何修改事件、删除事件者查看事件执行日志,但根据用户当前的问题,可能不需要深入这些细节,但可以简要提及,者建议他们如果有进一步的问题再询问。</think>在MySQL中可以通过 **事件(Events)** 创建定时作业,以下是详细操作步骤: --- ### 一、前置条件 1. **启用事件调度器** MySQL默认关闭事件调度器,需先启用: ```sql -- 查看当前状态 SHOW VARIABLES LIKE 'event_scheduler'; -- 开启调度器(需SUPER权限) SET GLOBAL event_scheduler = ON; ``` 2. **用户权限** 创建事件的用户需具备 `EVENT` 权限(可通过GRANT授权)。 --- ### 二、创建事件语法 ```sql CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule -- 定义执行时间 [ON COMPLETION [NOT] PRESERVE] -- 是否保留事件(默认NOT PRESERVE) [ENABLE | DISABLE | DISABLE ON SLAVE] -- 状态控制 DO event_body; -- 要执行的SQL语句存储过程 ``` --- ### 三、核心时间计划配置 #### 1. 一次性执行 ```sql -- 在指定时执行一次 ON SCHEDULE AT '2024-05-30 23:00:00' ``` #### 2. 周期性重复执行 ```sql -- 每天凌晨执行 ON SCHEDULE EVERY 1 DAY STARTS '2024-05-30 00:00:00' -- 每小时执行一次(无结束时间) ON SCHEDULE EVERY 1 HOUR -- 每5分钟执行,持续到指定日期 ON SCHEDULE EVERY 5 MINUTE STARTS NOW() ENDS '2024-12-31 23:59:59' ``` --- ### 四、完整示例 #### 示例1:每天清理过期日志 ```sql CREATE EVENT cleanup_logs ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP DO DELETE FROM logs WHERE create_time < NOW() - INTERVAL 30 DAY; ``` #### 示例2:每小时统计订单量 ```sql CREATE EVENT update_order_stats ON SCHEDULE EVERY 1 HOUR COMMENT '每小时更新订单统计表' DO INSERT INTO order_stats(hour, total) VALUES (DATE_FORMAT(NOW(), '%Y-%m-%d %H:00'), (SELECT COUNT(*) FROM orders WHERE created_at >= NOW() - INTERVAL 1 HOUR)); ``` --- ### 五、管理事件 ```sql -- 修改事件(可调整时间计划执行内容) ALTER EVENT event_name ON SCHEDULE EVERY 2 DAY DO ...新SQL语句...; -- 临时禁用事件 ALTER EVENT event_name DISABLE; -- 删除事件 DROP EVENT IF EXISTS event_name; ``` --- ### 六、注意事项 1. **时区问题**:事件默认使用服务器时区,可用 `SET time_zone = '+8:00'` 调整 2. **错误处理**:事件执行失败会记录到错误日志,但不会自动重试 3. **长事务控制**:避免事件中的SQL执行时间过长影响系统性能 可通过 `SHOW EVENTS` 查询 `information_schema.EVENTS` 表验证事件是否生效。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值