带你了解MySQL中的事件调度器EVENT
作者:数据和云 发布时间:2024-01-18 05:55:16
MySQL中的事件调度器,EVENT,也叫定时任务,类似于Unix crontab或Windows任务调度程序。
EVENT由其名称和所在的schema唯一标识。
EVENT根据计划执行特定操作。操作由SQL语句组成,语句可以是BEGIN…END语句块。EVENT可以是一次性的,也可以是重复性的。一次性EVENT只执行一次,周期性EVENT以固定的间隔重复其操作,并且可以为周期性EVENT指定开始日期和时间、结束日期和时间。(默认情况下,定期EVENT在创建后立即开始,并无限期地继续,直到它被禁用或删除。)
EVENT由一个特殊的事件调度器线程执行,用SHOW PROCESSLIST可以查看。
root@database-one 13:44: [gftest]> show variables like '%scheduler%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
1 row in set (0.01 sec)
root@database-one 13:46: [gftest]> show processlist;
+--------+------+----------------------+-----------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+------+----------------------+-----------+---------+------+----------+------------------+
......
+--------+------+----------------------+-----------+---------+------+----------+------------------+
245 rows in set (0.00 sec)
root@database-one 13:46: [gftest]> set global event_scheduler=1;
Query OK, 0 rows affected (0.00 sec)
root@database-one 13:47: [gftest]> show variables like '%scheduler%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
1 row in set (0.01 sec)
root@database-one 13:47: [gftest]> show processlist;
+--------+-----------------+----------------------+-----------+---------+------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+-----------------+----------------------+-----------+---------+------+------------------------+------------------+
......
| 121430 | event_scheduler | localhost | NULL | Daemon | 33 | Waiting on empty queue | NULL |
......
+--------+-----------------+----------------------+-----------+---------+------+------------------------+------------------+
246 rows in set (0.01 sec)
可以看到,默认情况下,MySQL的EVENT没有打开,通过设置event_scheduler参数来打开或者关闭EVENT。打开后就会多一个event_scheduler,这个就是事件调度器线程。
除了打开和关闭,还可以禁用,要禁用EVENT,请使用以下两种方法之一:
启动MySQL时用命令行参数
--event-scheduler=DISABLED
在MySQL配置文件中配置参数
event_scheduler=DISABLED
MySQL 5.7中创建EVENT的完整语法如下:
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
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}
详细说明可以参考官网https://dev.mysql.com/doc/refman/5.7/en/create-event.html
我们通过一个实例来验证下。
1)创建一张表。
root@database-one 13:47: [gftest]> create table testevent(id int auto_increment primary key,create_time datetime);
Query OK, 0 rows affected (0.01 sec)
root@database-one 13:50: [gftest]> select * from testevent;
Empty set (0.00 sec)
2)创建一个EVENT,每3秒往表中插一条记录。
root@database-one 13:50: [gftest]> create event insert_date_testevent on schedule every 3 second do
-> insert into testevent(create_time) values(now());
Query OK, 0 rows affected (0.01 sec)
root@database-one 13:53: [gftest]> show events \G
*************************** 1. row ***************************
Db: gftest
Name: insert_date_testevent
Definer: root@%
Time zone: +08:00
Type: RECURRING
Execute at: NULL
Interval value: 3
Interval field: SECOND
Starts: 2020-03-26 13:53:10
Ends: NULL
Status: ENABLED
Originator: 1303306
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
3)过一会,去表中查询数据。
root@database-one 13:53: [gftest]> select * from testevent;
+----+---------------------+
| id | create_time |
+----+---------------------+
| 1 | 2020-03-26 13:53:10 |
| 2 | 2020-03-26 13:53:13 |
| 3 | 2020-03-26 13:53:16 |
| 4 | 2020-03-26 13:53:19 |
| 5 | 2020-03-26 13:53:22 |
| 6 | 2020-03-26 13:53:25 |
| 7 | 2020-03-26 13:53:28 |
| 8 | 2020-03-26 13:53:31 |
| 9 | 2020-03-26 13:53:34 |
| 10 | 2020-03-26 13:53:37 |
| 11 | 2020-03-26 13:53:40 |
| 12 | 2020-03-26 13:53:43 |
| 13 | 2020-03-26 13:53:46 |
| 14 | 2020-03-26 13:53:49 |
| 15 | 2020-03-26 13:53:52 |
| 16 | 2020-03-26 13:53:55 |
+----+---------------------+
16 rows in set (0.00 sec)
从表里数据可以看到,创建的插数定时任务已经在正常运行了。
EVENT的详细信息除了用show event命令,还可以从mysql.event或information_schema.events中查询,也可以用show create event命令查看。
root@database-one 00:09: [gftest]> select * from mysql.event \G
*************************** 1. row ***************************
db: gftest
name: insert_date_testevent
body: insert into testevent(create_time) values(now())
definer: root@%
execute_at: NULL
interval_value: 3
interval_field: SECOND
created: 2020-03-26 13:53:10
modified: 2020-03-26 13:53:10
last_executed: 2020-03-26 16:09:37
starts: 2020-03-26 05:53:10
ends: NULL
status: ENABLED
on_completion: DROP
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
comment:
originator: 1303306
time_zone: +08:00
character_set_client: utf8
collation_connection: utf8_general_ci
db_collation: utf8_general_ci
body_utf8: insert into testevent(create_time) values(now())
1 row in set (0.00 sec)
root@database-one 00:09: [gftest]> select * from information_schema.events \G
*************************** 1. row ***************************
EVENT_CATALOG: def
EVENT_SCHEMA: gftest
EVENT_NAME: insert_date_testevent
DEFINER: root@%
TIME_ZONE: +08:00
EVENT_BODY: SQL
EVENT_DEFINITION: insert into testevent(create_time) values(now())
EVENT_TYPE: RECURRING
EXECUTE_AT: NULL
INTERVAL_VALUE: 3
INTERVAL_FIELD: SECOND
SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
STARTS: 2020-03-26 13:53:10
ENDS: NULL
STATUS: ENABLED
ON_COMPLETION: NOT PRESERVE
CREATED: 2020-03-26 13:53:10
LAST_ALTERED: 2020-03-26 13:53:10
LAST_EXECUTED: 2020-03-27 00:10:22
EVENT_COMMENT:
ORIGINATOR: 1303306
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
1 row in set (0.02 sec)
root@database-one 00:10: [gftest]> show create event insert_date_testevent \G
*************************** 1. row ***************************
Event: insert_date_testevent
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
time_zone: +08:00
Create Event: CREATE DEFINER=`root`@`%` EVENT `insert_date_testevent` ON SCHEDULE EVERY 3 SECOND STARTS '2020-03-26 13:53:10' ON COMPLETION NOT PRESERVE ENABLE DO insert into testevent(create_time) values(now())
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
来源:https://cloud.tencent.com/developer/article/1608131


猜你喜欢
- vue在做大型项目时,会用到多状态管理,vuex允许我们将store分割成多个模块,每个模块内都有自己的state、mutation、act
- 前言命令模式,也称为动作或者事务模式,很多教材会用饭馆来举例。作为顾客的我们是命令的下达者,服务员是这个命令的接收者,菜单是这个实际的命令,
- 引入在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对
- 目录Python协程及asyncio基础知识定义协程函数及执行方法的演变创建协程任务的演变获取协程任务执行结果通过asyncio.gathe
- 描述remove() 函数用于移除列表中某个值的第一个匹配项。语法remove()方法语法:list.remove(obj)参数obj --
- forEaches5出来的方法,这是我在react中用的最多的遍历方法之一,用法如下:models.forEach(model =>
- 对于React,Vue构建的单页面应用老说,SEO是一个众所周知的问题。服务端渲染(SSR-server Side Render)是目前看来
- 1. 栗子为了加深大家的印象,首先我们来看个例子:图示如下:2. 矩形计算面积我们知道,在数学中,积分运算表示上述曲线和x轴围成的封闭区域的
- 数组中重复的数字在上一篇博客中剑指Offer之面试题3: 数组中重复的数字中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素。
- 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失。因此,如果你想要编写一些更大的程序,为准备解释器输入使用一
- 介绍当在图像上训练深度神经网络模型时,通过对由数据增强生成的更多图像进行训练,可以使模型更好地泛化。常用的增强包括水平和垂直翻转/移位、以一
- asp如何显示全部的环境变量?<%@Language="VBScript"%><%dim H
- 1. HADOOP背景介绍1.1 什么是HADOOP1.HADOOP是apache旗下的一套开源软件平台2.HADOOP提供的功
- 一、随机数种子为什么要提出随机数种子呢?咱们前面提到过了,随机数均是模拟出来的, 想要模拟的比较真实,就需要变换种子函数内的数值,一般以时间
- 我们可以使用matplotlib.pyplot.locator_params()来控制刻度线 * 的行为。 即使通常会自动确定标记点的位置,
- 本文实例分析了php中get_meta_tags()、CURL与user-agent用法。分享给大家供大家参考。具体分析如下:get_met
- 本文实例讲述了Python中super函数用法。分享给大家供大家参考,具体如下:这是个高大上的函数,在python装13手册里面介绍过多使用
- 1、string-->numberstring类型 *1 即可变成 number类型2
- python注释方法方式1单行注释:shift + #(在代码的最前面输入,非选中代码进行注释)多行注释:同单行一样在每一行的前面输入shi
- 在利用tensorflow进行文本挖掘工作的时候,经常涉及到维度扩展和压缩工作。比如对文本进行embedding操作完成之后,若要进行卷积操