千家信息网

mysql定时任务(event事件)实现详解

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,1.事件简介事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的"事件调度器"。事件和触发器类似,都是在某些
千家信息网最后更新 2026年11月03日mysql定时任务(event事件)实现详解

1.事件简介

事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的"事件调度器"。

事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于他们彼此相似,所以事件也称为临时性触发器。

事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。

2 事件的优缺点

2.1 优点

一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。
可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。

2.2 缺点

定时触发,不可以调用。

3 创建事件

一条create event语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件调度(eventschedule,表示事件何时启动以及按什么频率启动;

第二部分是事件动作(event action),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者
benin...end语句块,这两种情况允许我们执行多条SQL。

一个事件可以是活动(打开)的或停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中,但调度器不会检查它是否应该调用。在一个事件创建之后,它立即变为活动的,一个活动的事件可以执行一次或者多次。

3.1 创建语法如下

  CREATE     [DEFINER = { user | CURRENT_USER }]     EVENT     [IF NOT EXISTS]     event_name     ON SCHEDULE schedule     [ON COMPLETION [NOT] PRESERVE]     [ENABLE | DISABLE | DISABLE ON SLAVE]     [COMMENT 'comment']     DO event_body;       schedule:     AT timestamp [+ INTERVAL interval] ...    | EVERY interval     [STARTS timestamp [+ INTERVAL interval] ...]     [ENDS timestamp [+ INTERVAL interval] ...]       interval:     quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |          WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |          DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

名词解释:

event_name :创建的event名字(唯一确定的)。
ON SCHEDULE:计划任务。
schedule: 决定event的执行时间和频率(注意时间一定要是将来的时间,过去的时间会出错),有两种形式 AT和EVERY。
[ON COMPLETION [NOT] PRESERVE]: 可选项,默认是ON COMPLETION NOT PRESERVE 即计划任务执行完毕后自动drop该事件;ON COMPLETION PRESERVE则不会drop掉。
[COMMENT 'comment'] :可选项,comment 用来描述event;相当注释,最大长度64个字节。
[ENABLE | DISABLE] :设定event的状态,默认ENABLE:表示系统尝试执行这个事件, DISABLE:关闭该事情,可以用alter修改
DO event_body: 需要执行的sql语句(可以是复合语句)。CREATE EVENT在存储过程中使用时合法的。

3.2 开启关闭事件调度器

3.2.1 MySQL事件调度器event_scheduler负责调用事件,它默认是关闭的。这个调度器不断地监视一个事件是否要调用, 要创建事件,必须打开调度器。

mysql> show variables like '%event_scheduler%'; +-----------------+-------+ | Variable_name  | Value | +-----------------+-------+ | event_scheduler | OFF  | +-----------------+-------+ 

3.2.2 开启事件调度器

通过命令行

可通过如下任何一个命令行

SET GLOBAL event_scheduler = ON; SET @@global.event_scheduler = ON; SET GLOBAL event_scheduler = 1; SET @@global.event_scheduler = 1; 

通过配置文件my.cnf

event_scheduler = 1 #或者ON

查看调度器线程

mysql> show processlist; +----+-----------------+-----------+------+---------+------+------------------------+------------------+ | Id | User      | Host   | db  | Command | Time | State         | Info       | +----+-----------------+-----------+------+---------+------+------------------------+------------------+ | 2 | root      | localhost | NULL | Query  |  0 | NULL          | show processlist | | 3 | event_scheduler | localhost | NULL | Daemon |  6 | Waiting on empty queue | NULL| +----+-----------------+-----------+------+---------+------+------------------------+------------------+ 

3.2.3 关闭事件调度器

通过命令行

可通过如下任何一个命令行

SET GLOBAL event_scheduler = OFF; SET @@global.event_scheduler = OFF; SET GLOBAL event_scheduler = 0; SET @@global.event_scheduler = 0; 

通过配置文件my.cnf

在[mysqld]下增加

event_scheduler = 0 #或者OFF,DISABLED

查看调度器线程

mysql> show processlist; +----+------+-----------+------+---------+------+-------+------------------+ | Id | User | Host   | db  | Command | Time | State | Info       | +----+------+-----------+------+---------+------+-------+------------------+ | 2 | root | localhost | NULL | Query  |  0 | NULL | show processlist | +----+------+-----------+------+---------+------+-------+------------------+

3.3 例如:创建一个表记录每次事件调度的名字和事件戳

3.3.1 创建测试表

mysql> drop table if exists events_list; mysql> create table events_list(event_name varchar(20) not null, event_started timestamp not null);

3.3.2 创建事件1(立即启动事件)

create event event_now on schedule at now() do insert into events_list values('event_now', now()); 

查看事件执行结果

mysql> select * from events_list; +------------+---------------------+ | event_name | event_started    | +------------+---------------------+ | event_now | 2014-07-01 04:06:40 | +------------+---------------------+ 

3.3.3 创建事件2(每分钟启动事件)

create event test.event_minute on schedule every 1 minute  do insert into events_list values('event_now', now()); 

查看事件执行结果

mysql> select * from events_list; +------------+---------------------+ | event_name | event_started    | +------------+---------------------+ | event_now | 2014-07-01 04:26:53 | | event_now | 2014-07-01 04:27:53 | | event_now | 2014-07-01 04:28:53 | +------------+---------------------+ 

3.3.3 创建事件3(每秒钟启动事件)

CREATE event event_now ON SCHEDULE EVERY 1 SECONDDO INSERT INTO event_test VALUES(1); 

3.3.4 创建事件4(每秒钟调用存储过程)

CREATE DEFINER=`root`@`localhost` EVENT `eventUpdateStatus` ON SCHEDULE EVERY 1 SECOND STARTS '2017-11-21 00:12:44' ON COMPLETION PRESERVE ENABLE DO call updateStatus()

3.4 注意:

默认创建事件存储在当前库中,也可显示指定事件创建在哪个库中

通过show events只能查看当前库中创建的事件

事件执行完即释放,如立即执行事件,执行完后,事件便自动删除,多次调用事件或等待执行事件可以查看到。

如果两个事件需要在同一时刻调用,mysql会确定调用他们的顺序,如果要指定顺序,需要确保一个事件至少在另一个事件1秒后执行

对于递归调度的事件,结束日期不能在开始日期之前。

select可以包含在一个事件中,然而他的结果消失了,就好像没执行过。

4 查看事件

查看当前所在库的事件

mysql> show events;

查看所有事件

mysql> select * from mysql.event;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

事件 调度 任务 语句 存储 命令 数据 时间 活动 动作 数据库 系统 线程 结果 触发器 过程 精确 操作系统 两个 事情 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司 伟宏互联网科技 朗新科技与工业互联网 喔噻互联网科技 天津摩尔互联网科技 睿民互联网科技 有木互联网科技 科技大学互联网专业好不好 常德市电业局互联网科技部 科技与互联网哪个更好 湖南诚度互联网科技有限公司 河南猎农互联网科技有限公司 开一家科技互联网公司需要多少钱 互联网科技大奖都有哪些公司 广西互联网科技孵化中心 互联网科技公司营业执照怎么办理 2021互联网科技公司排名 皮皮虾互联网科技有限公司 绵阳真晨互联网科技有限公司 科技发展第三阶段互联网时代 湖南永感互联网科技有限公司 今日互联网科技 工业互联网科技新基建 金融科技和互联网金融 互联网教育科技公司vipkid 青海科技产业互联网发展 萌小萌互联网科技河南有限公司 互联网科技收购价值 科技和互联网行业的特点 北京品多多互联网科技有限公司
0