Mysql编写定时任务事件

本文介绍如何利用MySQL的事件调度器实现定时任务,如每半小时重置统计数据等,并提供了创建事件、存储过程及管理调度器状态的具体步骤。

场景:

  例如:某系统,用户每天只能拥有一次的抽奖机会,抽过后当天就不可再抽,但是过了24:00点后用户就重新拥有一次抽奖机会。像这种需要数据库定时对某个字段进行更新操作的任务,完全可以通过数据库本身的事件机制进行操作,而服务器端也不需要用额外的代码进行这种监控定时的操作。

Mysql:

  本文讨论的是Mysql数据库,Event Scheduler事件调度器应该是在Mysql5.1引入的,所以使用定时任务调度时,请注意查看你的Mysql版本。

创建事件调度的语法:

/*创建事件event_name*/
DELIMITER $$

CREATE event IF NOT EXISTS event_name

ON SCHEDULE 任务条件 

ON COMPLETION PRESERVE

DO SQL操作

DELIMITER ;

实例情景:每半个小时更新统计字段count为0,

/*创建定时定时更新count字段事件*/
DELIMITER $$

CREATE event IF NOT EXISTS update_count

ON SCHEDULE EVERY 30 MINUTE 

/*MYSQL注意时区设置,默认非中国时区*/
STARTS TIMESTAMP '2009-12-18 02:58:00' ON COMPLETION PRESERVE DO update tb_count set count=0 $$ DELIMITER ;

如上,创建了一个名叫update_count的事件,执行条件则为每30分钟执行一次,(EVERY 30 MINUTE),执行Sql为(update tb_count set count=0), 当然你可能会按天执行,所以你也可以写(EVERY 1 DAY),

如果执行的任务Sql复杂,我们可以写触发器,直接看示例代码:

DELIMITER $$

DROP PROCEDURE IF EXISTS update_count$$

CREATE PROCEDURE update_count()

BEGIN
    UPDATE tb_count SET count=0;
END$$

DELIMITER ;

以上为创建一个存储过程update_count,执行对tb_count中count字段的更新。任务中代码中do字段后则改为(call update_count() $$)。当然你可能会更复杂的需求。

添加完event后,还需要查看event_scheduler是否开启,否则添加的event不会执行,移步下面的代码:

/*查看event是否开启*/
SHOW VARIABLES LIKE '%sche%';
/*开启event*/
SET GLOBAL event_scheduler=1;

查看和关闭你所添加的event:

 

/*关闭 event */
ALTER event update_count ON COMPLETION PRESERVE DISABLE;

/*启用 event */
ALTER event update_count ON COMPLETION PRESERVE ENABLE;

 更多MySql语法可查看:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html

转载于:https://www.cnblogs.com/zivxiaowei/p/3725629.html

MySQL 中实现定时任务主要有两种方式:一种是利用 MySQL 自身提供的事件调度器(Event Scheduler),另一种则是借助外部操作系统(如 Linux)的任务调度工具。 ### 利用 MySQL 的 Event Scheduler 实现定时任务 MySQL 提供了内置的事件调度器功能,允许用户定义和执行周期性或一次性任务。要启用此功能,需先确认 `event_scheduler` 是否已开启。可通过以下命令检查其状态: ```sql SELECT @@event_scheduler; -- 返回值为 ON 表示已开启 SHOW VARIABLES LIKE 'event_scheduler'; ``` 如果返回值为 OFF,则需要手动启动事件调度器,可以通过修改配置文件或将以下语句加入初始化脚本中来永久生效[^2]: ```sql SET GLOBAL event_scheduler = ON; ``` 一旦事件调度器处于活动状态,就可以创建自定义事件。例如,为了定期清理旧日志记录,可以编写如下 SQL 脚本[^3]: ```sql CREATE EVENT IF NOT EXISTS cleanup_old_logs ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO BEGIN DELETE FROM logs WHERE created_at < DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY); END; ``` 在此例子中,`cleanup_old_logs` 将每隔一天运行一次,并删除超过七天的日志条目。值得注意的是,在定义重复发生的事件时,推荐使用标准时间单位(如 YEAR、MONTH、DAY 等)。对于单次执行的任务,可以选择指定精确的时间点通过 `AT` 子句完成设置[^3]。 另外,考虑到调试便利性和历史追踪需求,建议在声明结束条件的同时加上 `ON COMPLETION PRESERVE` 参数,如此即使任务到期也不会自动销毁对象实例[^3]。 ### 借助 Linux Cron Job 执行 MySQL 定时任务 除了依赖数据库自身的机制外,还可以结合服务器端的操作系统设施安排自动化作业。以 Unix/Linux 平台为例,Cron 是一个广泛使用的后台守护程序,用于按预定时刻触发指令序列。假设存在一个存储过程负责更新主键生成器表中的数值[^4],则可以在终端编辑 crontab 文件添加类似下面的一行规则: ```bash 0 2 * * * mysql -u username -p'password' dbname -e "CALL proc_modify_primary_key_value('primary_key_generator_table', 'value', '1', 'name', 'PK_CUSTOMER_ID');" ``` 这条 cron job 设置会在每日凌晨两点连接至目标数据库调用给定的过程函数。相比单纯依靠 MySQL Events 来说,这种方法提供了更大的灵活性,因为不仅可以限定何时做什么事情,还能够引入更多复杂的逻辑判断或者跨平台协作场景下的交互操作。 无论是选择哪一类解决方案都需要仔细权衡利弊得失,包括但不限于性能开销、安全防护等级以及运维成本等方面因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值