MySQL 定时器

MySQL 定时器

MySQL 定时器

工作中常存在一些固定任务,需要周期性执行。

有些需要在服务中,也有一些完全存在于数据层面。

对于数据层面的任务,可以借助定时器,而不需要在服务中执行。

这里介绍的是MySQL数据库的定时器。

功能开启

首先查看定时器功能是否开启

sql 复制代码
SHOW VARIABLES LIKE 'event_scheduler';

结果集中,OFF表示关闭 , ON表示开启。

若为OFF,则需要开启该功能:

sql 复制代码
SET GLOBAL event_scheduler = 'ON'; 

sql 复制代码
SET GLOBAL event_scheduler = 1; 

此处注意,需要 root 用户权限 才能执行。

使用这种方式,若MySQL服务后续重启(虽然通常很少重启,但也会有的),定时器功能依然会恢复关闭。

可以通过修改配置文件的方式,调整定时器默认开关。

方法也比较简单,找到mysql根目录下 my.ini 文件,打开并在 [mysqld] 标记下方添加:

event_scheduler = ON

示例

创建定时器:

sql 复制代码
CREATE EVENT [EVENT_NAME] 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) ON COMPLETION PRESERVE DO CALL PROCEDURE_NAME();

该定时器设置为每个季度第一天的凌晨一点,执行 PROCEDURE_NAME() 任务。

注意

有几个关键点需要注意:

  1. EVENT_NAME 名称最大长度可以是64个字节,同一数据库中唯一。
  2. ON SCHEDULE 计划任务,可以像上述示例一样,使用EVERY关键字,创建重复执行的任务;也可以使用AT,创建固定时间点执行的任务。
  3. DO [sql_statement],上述示例中使用的是DO CALL PROCEDURE_NAME(),执行存储过程;也可以是具体的SQL语句。
    如果是复合语句,按照顺序写在BEGIN和END标识符中即可,如:
sql 复制代码
BEGIN
	DROP TABLE TEST_TABLE;
	CALL PROCEDURE_NAME();
END
  1. 删除已经创建的事件使用DROP EVENT语句。
    若事件正在执行中,将会在执行结束后删除。
    使用DROP USER和DROP DATABASE 语句同时会将包含其中的事件删除。
  2. ON COMPLETION PRESERVE,在任务执行结束后,保留定时器。若设置为NOT PRESERVE,则在任务结束后清除定时器,若未设置,默认NOT PRESERVE。
相关推荐
许彰午15 小时前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
iAm_Ike15 小时前
怎么关闭MongoDB不需要的HTTP管理接口及REST API
jvm·数据库·python
whn197715 小时前
虚拟机搭建oracle 19c rac 点滴
数据库·oracle
m0_7411733315 小时前
CSS移动端实现卡片悬浮投影_利用box-shadow设置层次感
jvm·数据库·python
Lyyaoo.15 小时前
Session粘滞性问题->Redis实现session共享
数据库·redis·缓存
珠海西格电力15 小时前
零碳园区管理系统“云-边-端”架构协同的价值及具体案例
大数据·数据库·人工智能·架构·能源
sinat_3834373615 小时前
如何在 Laravel 中筛选并格式化匹配预定义列表的产品数据
jvm·数据库·python
2401_8463395615 小时前
mysql如何用执行流程思维写好SQL_SQL优化方法总结
jvm·数据库·python
鸽芷咕15 小时前
KingbaseES数据库设计规范与SQL开发最佳实践
数据库·sql·设计规范
forEverPlume15 小时前
SQL如何统计分组内不重复值的数量_COUNT与DISTINCT结合应用
jvm·数据库·python