千家信息网

mysql的计划任务与事件调度实例分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本文实例讲述了mysql的计划任务与事件调度。分享给大家供大家参考,具体如下:mysql事件是基于预定义的时间表运行的任务,因此有时它被称为预定事件。mysql事件也被称为"时间触发",因为它是由时间
千家信息网最后更新 2026年11月01日mysql的计划任务与事件调度实例分析

本文实例讲述了mysql的计划任务与事件调度。分享给大家供大家参考,具体如下:

mysql事件是基于预定义的时间表运行的任务,因此有时它被称为预定事件。mysql事件也被称为"时间触发",因为它是由时间触发的,而不是像触发器一样更新表来触发的。mysql事件类似于UNIX中的cron作业或Windows中的任务调度程序。我们可以在优化数据库表,清理日志,归档数据或在非高峰时间生成复杂的报告的时候使用mysql事件。

mysql使用一个名为事件调度线程的特殊线程来执行所有调度的事件。我们可以通过执行以下命令来查看事件调度程序线程的状态:

SHOW PROCESSLIST;

执行上面查询语句,得到以下结果:

mysql> SHOW PROCESSLIST;+----+------+-----------------+----------+---------+------+----------+------------------+| Id | User | Host      | db    | Command | Time | State  | Info       |+----+------+-----------------+----------+---------+------+----------+------------------+| 2 | root | localhost:50405 | NULL   | Sleep  | 1966 |     | NULL       || 3 | root | localhost:50406 | yiibaidb | Sleep  | 1964 |     | NULL       || 4 | root | localhost:50407 | yiibaidb | Query  |  0 | starting | SHOW PROCESSLIST |+----+------+-----------------+----------+---------+------+----------+------------------+3 rows in set

默认情况下,事件调度程序线程未启用。 要启用和启动事件调度程序线程,需要执行以下命令:

SET GLOBAL event_scheduler = ON;

现在看到事件调度器线程的状态,再次执行SHOW PROCESSLIST命令,结果如下所示:

mysql> SHOW PROCESSLIST;+----+-----------------+-----------------+----------+---------+------+------------------------+------------------+| Id | User      | Host      | db    | Command | Time | State         | Info       |+----+-----------------+-----------------+----------+---------+------+------------------------+------------------+| 2 | root      | localhost:50405 | NULL   | Sleep  | 1986 |            | NULL       || 3 | root      | localhost:50406 | luyaran | Sleep  | 1984 |            | NULL       || 4 | root      | localhost:50407 | luyaran | Query  |  0 | starting        | SHOW PROCESSLIST || 5 | event_scheduler | localhost    | NULL   | Daemon |  6 | Waiting on empty queue | NULL       |+----+-----------------+-----------------+----------+---------+------+------------------------+------------------+4 rows in set

要禁用并停止事件调度程序线程,可通过执行SET GLOBAL命令将event_scheduler其值设置为OFF :

SET GLOBAL event_scheduler = OFF;

我们知道,事件是一个包含SQL语句的命名对象,创建事件与创建其他数据库对象(如存储过程或触发器)类似,然而,存储过程仅在直接调用时执行; 触发器则与一个表相关联的事件(例如插入,更新或删除)事件发生时,可以在一次或更多的规则间隔执行事件时执行触发。那么,事件呢?我们接下来就尝试使用CREATE EVENT语句,来创建事件,下面先来看下语法结构:

CREATE EVENT [IF NOT EXIST] event_nameON SCHEDULE scheduleDOevent_body

我们来详细看下上述sql中的参数的含义:

首先,在CREATE EVENT子句之后指定事件名称。事件名称在数据库模式中必须是唯一的。

其次,在ON SCHEDULE子句后面加上一个表。如果事件是一次性事件,则使用语法:AT timestamp [+ INTERVAL],如果事件是循环事件,则使用EVERY子句:EVERY interval STARTS timestamp [+INTERVAL] ENDS timestamp [+INTERVAL]

第三,将DO语句放在DO关键字之后。请注意,可以在事件主体内调用存储过程。 如果您有复合SQL语句,可以将它们放在BEGIN END块中。

我们先来创建一个messages表来做演示:

CREATE TABLE IF NOT EXISTS messages (  id INT PRIMARY KEY AUTO_INCREMENT,  message VARCHAR(255) NOT NULL,  created_at DATETIME NOT NULL);

完事我们来使用CREATE EVENT语句创建一个事件:

CREATE EVENT IF NOT EXISTS test_event_01ON SCHEDULE AT CURRENT_TIMESTAMPDO INSERT INTO messages(message,created_at) VALUES('Test MySQL Event 1',NOW());

检查messages表; 会看到有1条记录,这意味着事件在创建时被执行:

mysql> SELECT * FROM messages;+----+--------------------+---------------------+| id | message      | created_at     |+----+--------------------+---------------------+| 1 | Test MySQL Event 1 | 2017-08-03 04:23:11 |+----+--------------------+---------------------+1 row in set

要显示数据库(testdb)的所有事件,请使用以下语句:

SHOW EVENTS FROM testdb;

执行上面查询看不到任何行返回,因为事件在到期时自动删除。 在我们的示例中,它是一次性的事件,在执行完成时就过期了。要更改此行为,可以使用ON COMPLETION PRESERVE子句。以下语句创建另一个一次性事件,在其创建时间1分钟后执行,执行后不会被删除:

CREATE EVENT test_event_02ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTEON COMPLETION PRESERVEDO  INSERT INTO messages(message,created_at)  VALUES('Test MySQL Event 2',NOW());

等待1分钟后,查看messages表,添加了另一条记录:

mysql> SELECT * FROM messages;+----+--------------------+---------------------+| id | message      | created_at     |+----+--------------------+---------------------+| 1 | Test MySQL Event 1 | 2017-08-03 04:23:11 || 2 | Test MySQL Event 2 | 2017-08-03 04:24:48 |+----+--------------------+---------------------+2 rows in set

如果再次执行SHOW EVENTS语句,看到事件是由于ON COMPLETION PRESERVE子句的影响:

mysql> SHOW EVENTS FROM testdb;+--------+---------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+| Db   | Name     | Definer    | Time zone | Type   | Execute at     | Interval value | Interval field | Starts | Ends | Status  | Originator | character_set_client | collation_connection | Database Collation |+--------+---------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+| testdb | test_event_02 | root@localhost | SYSTEM  | ONE TIME | 2017-08-03 04:24:48 | NULL      | NULL      | NULL  | NULL | DISABLED |     0 | utf8         | utf8_general_ci   | utf8_general_ci  |+--------+---------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+1 row in set

我们再来创建一个循环的事件,每分钟执行一次,并在其创建时间的1小时内过期:

CREATE EVENT test_event_03ON SCHEDULE EVERY 1 MINUTESTARTS CURRENT_TIMESTAMPENDS CURRENT_TIMESTAMP + INTERVAL 1 HOURDO  INSERT INTO messages(message,created_at)  VALUES('Test MySQL recurring Event',NOW());

我们要注意,我们使用STARTS和ENDS子句定义事件的有效期。等待个3,5分钟后再查看messages表数据,以测试验证此循环事件的执行:

mysql> SELECT * FROM messages;+----+----------------------------+---------------------+| id | message          | created_at     |+----+----------------------------+---------------------+| 1 | Test MySQL Event 1     | 2017-08-03 04:23:11 || 2 | Test MySQL Event 2     | 2017-08-03 04:24:48 || 3 | Test MySQL recurring Event | 2017-08-03 04:25:20 || 4 | Test MySQL recurring Event | 2017-08-03 04:26:20 || 5 | Test MySQL recurring Event | 2017-08-03 04:27:20 |+----+----------------------------+---------------------+5 rows in set

完事我们可以使用DROP EVENT语句来删除事件,看下语法结构:

DROP EVENT [IF EXISTS] event_name;

要删除test_event_03的事件,我们可以使用如下sql:

DROP EVENT IF EXISTS test_event_03;

好啦,本次记录就到这里了。

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL索引操作技巧汇总》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

事件 语句 调度 数据 线程 子句 数据库 时间 技巧 程序 命令 过程 存储 任务 一次性 触发器 语法 循环 再次 名称 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技图片 互联网科技工作委员会主任 为想互联网科技怎么样 互联网科技金融 万易互联网科技 银优互联网科技有限公司 苏州互联网科技贷款公司 互联网科技logo 互联网科技宣传片 卓越科技互联网 招聘 中国最先进互联网科技公司 云创客互联网科技公司 呼和浩特新华互联网科技学院 朱啸虎曾投资哪些互联网科技企业 广州百诚互联网科技有限公司官网 福建互联网展示科技馆设计 科技互联网专业工作会议发言稿 互联网科技创新方面的资料 武汉亿视互联网科技有限公司 互联网 科技节活动 微视频大赛 云之行互联网科技 互联网科技工作委员会副主任毛军 朗新科技与工业互联网 科技互联网技术 广西互联网科技公司 互联网科技公司介绍 科技伦理 互联网公司 互联网教育科技公司vipkid 语蝶互联网科技有限公司 上海同邻互联网科技有限公司规模
0