mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间

本文深入探讨了MySQL中事件(Event)的功能、配置及创建流程,并提供了多种时间设置示例,包括每日、每周、每月及按特定日期的定时任务。通过实际案例,指导读者如何在数据库中实现自动化任务。

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

转载自:http://blog.sina.com.cn/s/blog_6d39ac7e01017sd6.html

由于项目需要创建定时器(evevt),所以就百度了一下,发现基本都是来源于一个模板,有些功能还不全,现在自己总结一下。

注:mysql版本是从5.1开始才支持event的。如果你的版本低于5.1就先升级版本吧。

查看版本的方法有很多,这里只给大家提供一个    select version();

1.查看是否开启evevt与开启evevt。

1.1、MySQL evevt功能默认是关闭的,可以使用下面的语句来看evevt的状态,如果是OFF或者0,表示是关闭的。

              show VARIABLES  LIKE  '%sche%' ;
1.2、开启evevt功能
            SET GLOBAL event_scheduler = 1;
2.创建定时器的过程
2.1、创建测试表test
drop table if exists test;
create table test
(
id int(11) not null auto_increment primary key,
time datetime not null
) engine=innodb default charset=utf8;
2.2、创建evevt要调用的存储过程test_proce
delimiter //
drop procedure if exists test_proce//
create procedure test_proce()
begin
insert into test(time) values(now());
end//
delimiter ;
2.3、开启evevt(要使定时起作用,MySQL的常量GLOBAL event_scheduler必须为on或者是1)
执行show variables like 'event_scheduler';查看evevt是否开启;
若没开启执行set global event_scheduler='on';
2.4、创建事件test_event(其作用:每隔一秒自动调用test_proce()存储过程)
drop event if exists test_event;
create event test_event
on schedule every 1 second
on completion preserve disable
do call test_proce();
2.5、开启事件test_event
alter event test_event on completion preserve enable;
2.6、关闭事件test_event
alter event test_event on completion preserve disable;
2.7、查看表test
select * from test;
 
3.查看自己创建的event
如果要查看更加详细的信息,你需要root用户的授权,如果是你自己的数据库你可以用下面语句查看
select * from  mysql.event;
下面的我的evevt的查看结果
mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间

4.event的时间设置
设置event很简单,但是麻烦的是如何设置执行的时间,网上找了一些,自己总结了一下。
先看语句,如下面这个
     CREATE EVENT test_event ON SCHEDULE EVERY 1 DAY STARTS '2012-09-24 00:00:00'
     ON  COMPLETION PRESERVE ENABLE DO CALL test_procedure();
EVERY 后面的是时间间隔,可以选 1 second,3 minute,5 hour,9 day,1 month,1 quarter(季度),1 year 
从2013年1月13号0点开始,每天运行一次
ON SCHEDULE EVERY 1 DAY STARTS '2013-01-13 00:00:00'
从现在开始每隔九天定时执行
ON SCHEDULE EVERY 9 DAY STARTS NOW() 
每个月的一号凌晨1 点执行
on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);
每个季度一号的凌晨1点执行
on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);
每年1月1号凌晨1点执行
on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);
 
其他的 就大家自由组合了。。

<think>好的,用户问的是Flask-SQLAlchemy是否可以设置MySQL的自动定时器。我需要先理解这两个部分:Flask-SQLAlchemy的功能和MySQL的自动定时器是什么。 首先,Flask-SQLAlchemy是一个Flask扩展,用于简化在Flask应用中使用SQLAlchemy。它主要处理ORM(对象关系映射),让开发者用Python类来操作数据库,而不用直接写SQL语句。但自动定时器,比如MySQL的事件调度器,是数据库层面的功能,需要用到SQL语句来创建和管理。 接下来,我得确认MySQL的自动定时器是什么。MySQL的事件调度器允许在特定时间执行任务,比如定期清理数据生成报表。这通常通过CREATE EVENT语句来实现,属于数据库管理的范畴,而不是ORM直接处理的。 那问题来了,用户想知道是否可以通过Flask-SQLAlchemy来设置这些定时器。Flask-SQLAlchemy本身专注于ORM,不直接提供管理数据库事件的方法。不过,用户可能希望在不脱离Flask应用的情况下,利用现有的数据库连接来执行原生SQL,包括创建事件。 所以,可能的解决方案是使用SQLAlchemy的执行功能来运行原生SQL语句。例如,通过db.session.execute()来执行CREATE EVENT语句。但这需要MySQL的事件调度器已经启用,用户可能需要先检查event_scheduler的状态,必要时用SET GLOBAL开启。 另外,需要考虑权限问题。执行CREATE EVENT需要用户有EVENT权限,否则会报错。同时,事件的生命周期独立于应用,应用重启不会影响事件,除非在代码中每次启动都检查并创建事件,但这样可能会有重复创建的风险。 用户可能的需求场景是什么呢?比如定期清理日志、更新缓存等。这时候在Flask应用中初始化时创建事件可能是个办法,但要注意事件只需创建一次。者,用户可能混淆了数据库事件和应用层的定时任务,比如使用CeleryAPScheduler在应用层处理定时任务,这可能更常见,也更可控。 因此,我需要告诉用户,虽然Flask-SQLAlchemy不直接支持,但可以通过执行原生SQL来创建事件,同时建议应用层定时任务作为替代方案。这既解答了直接的问题,也提供了更常用的方法,满足用户可能的实际需求。</think>Flask-SQLAlchemy 本身不直接提供设置 MySQL 自动定时器Event Scheduler)的功能,但可以通过以下方法间接实现: --- ### **关键结论分步说明** 1. **MySQL 事件调度器本质** - MySQL定时器功能属于数据库层面的特性,需通过 SQL 语句 `CREATE EVENT` 实现 - 例如: ```sql CREATE EVENT my_event ON SCHEDULE EVERY 1 DAY DO DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY; ``` 2. **Flask-SQLAlchemy 的桥梁作用** - 可通过 SQLAlchemy 执行原生 SQL 语句来操作事件 - 示例代码: ```python from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() # 创建事件 db.session.execute(""" CREATE EVENT IF NOT EXISTS cleanup_logs ON SCHEDULE EVERY 1 HOUR DO DELETE FROM logs WHERE timestamp < NOW() - INTERVAL 7 DAY; """) db.session.commit() ``` 3. **必要前提条件** - 确保 MySQL 事件调度器已启用: ```sql SHOW VARIABLES LIKE 'event_scheduler'; -- 查看状态 SET GLOBAL event_scheduler = ON; -- 临时启用 ``` - 在 `my.cnf` 配置文件中永久启用: ```ini [mysqld] event_scheduler=ON ``` 4. **替代方案(更推荐)** - **应用层定时任务**:使用 Flask-APScheduler Celery ```python from apscheduler.schedulers.background import BackgroundScheduler scheduler = BackgroundScheduler() @scheduler.scheduled_job('interval', hours=1) def cleanup(): db.session.execute("DELETE FROM logs WHERE ...") db.session.commit() scheduler.start() ``` --- ### **注意事项** 1. **权限要求**:数据库账号需具备 `EVENT` 权限 2. **生命周期**:MySQL 事件与数据库实例绑定,独立于应用运行 3. **调试建议**:通过 `SHOW EVENTS` 查看事件状态 --- ### **推荐方案选择** - 若需严格依赖数据库层面触发 → 原生 SQL 事件 - 若需与应用逻辑深度绑定 → 使用 Flask-APScheduler/Celery 两种方式均可通过 Flask-SQLAlchemy 的数据库会话来操作数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值