博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL之事件调度器简单应用
阅读量:5993 次
发布时间:2019-06-20

本文共 6747 字,大约阅读时间需要 22 分钟。

一.MySQL之事件调度器语法详解

创建,修改,查看等语法参考官网文档链接,

创建事件(CREATE EVENT)

先来看一下它的语法:

CREATE EVENT [IF NOT EXISTS] event_nameON SCHEDULE schedule[ON COMPLETION [NOT] PRESERVE][ENABLE | DISABLE][COMMENT 'comment']DO sql_statement;schedule:AT TIMESTAMP [+ INTERVAL INTERVAL]| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]INTERVAL:quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |            WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |            DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

详细解析:

①definer:指明该event的用户,服务器在执行该事件时,使用该用户来检查权限。  默认用户为当前用户,即definer = current_user;  如果明确指明了definer,则必须遵循如下规则:    1.如果没有super权限,唯一允许的值就是自己当前用户,而不能设置为其他用户。    2.如果具有super权限,则可以指定任意存在的用户;如果指定的用户不存在,则事件在执行时会报错。②if not exists:如果事件已经存在,则不会创建,也不会报错。③on schedule子句:指定何时执行该事件,以及如何执行该事件  1)at timestamp用于创建单次执行的事件,timestamp执行事件执行的时间(如果指定的时间是过去的时间,则会产生一个warning),时间可以是具体的时间字符串或者是一个datetime类型的表达式(如current_timestamp):    如果要指定将来某个时间,直接使用at timestamp,例:at '2017-08-08 08:08:08';    如果要指定将来某个时间间隔,可利用interval关键字(interval关键字可以进行组合,at timestamp + INTERVAL 2 HOUR、 + INTERVAL 30 MINUTE)  2)every子句用于创建重复执行的事件,如果每分钟执行一次,则可以:EVERY 1 MINUTE。    当然,every子句可以指定一个开始时间和结束时间,通过STARTS和ENDS关键字来表示,具体语法与前面类似  例如:EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK。④通常情况下,如果一个事件已过期,则会被立即删除。但是,create event定义中通过on completion preserve子句可以保留已过期的时间。  默认:ON COMPLETION NOT PRESERVE,也就是不保存⑤默认情况下,enable on slave,事件一旦创建后就立即开始执行;可以通过disable关键字来禁用该事件。⑦do子句用于指示事件需要执行的操作,可以是一条SQL语句,也可以是被begin...end包括的语句块,也可以在语句块中调用存储过程。

基本格式:

CREATE EVENT event_nameON SCHEDULE  
DO
;

实例一:

首先来看一个简单的例子:

创建测试表:

CREATE TABLE `test1_event` (`id` int(8) NOT NULL AUTO_INCREMENT, `username` varchar(20) COLLATE utf8_unicode_ci NOT NULL,`password` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,PRIMARY KEY (`id`) #主键ID) ENGINE=innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

创建一个定时器 event_1

当前时间2分钟后开启每10秒插入一条记录到表test1_event

CREATE EVENT event_1 ON SCHEDULE EVERY  10 SECONDSTARTS CURRENT_TIMESTAMP + INTERVAL 2 MINUTEDO insert into test.test1_event(username,password,create_time) values ("李四","tomcat",now());
mysql> select * from test1_event;+----+----------+----------+---------------------+| id | username | password | create_time         |+----+----------+----------+---------------------+|  1 | 李四     | tomcat   | 2018-09-14 20:49:55 ||  2 | 李四     | tomcat   | 2018-09-14 20:50:05 ||  3 | 李四     | tomcat   | 2018-09-14 20:50:15 ||  4 | 李四     | tomcat   | 2018-09-14 20:50:25 ||  5 | 李四     | tomcat   | 2018-09-14 20:50:35 ||  6 | 李四     | tomcat   | 2018-09-14 20:50:45 ||  7 | 李四     | tomcat   | 2018-09-14 20:50:55 |+----+----------+----------+---------------------+7 rows in set (0.00 sec)

创建一个定时器 event_2:

当前时间1分钟后开启每5秒插入一条记录到表test2_event

delimiter $$create event event_2 on schedule every 5 second STARTS   CURRENT_TIMESTAMP + INTERVAL 1 MINUTECOMMENT 'xiaowu create'do     BEGIN           insert into test.test2_event(username,password,create_time) values("李四","tomcat",now());    END $$delimiter ;
mysql> select * from test2_event;+-----+----------+----------+---------------------+| id  | username | password | create_time         |+-----+----------+----------+---------------------+|   1 | 李四     | tomcat   | 2018-09-14 20:50:06 ||   2 | 李四     | tomcat   | 2018-09-14 20:50:11 ||   3 | 李四     | tomcat   | 2018-09-14 20:50:16 ||   4 | 李四     | tomcat   | 2018-09-14 20:50:21 ||   5 | 李四     | tomcat   | 2018-09-14 20:50:26 ||   6 | 李四     | tomcat   | 2018-09-14 20:50:31 ||   7 | 李四     | tomcat   | 2018-09-14 20:50:36 |+-----+----------+----------+---------------------+213 rows in set (0.00 sec)

查看事件:

show events;

查看event的状态信息:

mysql> select *  from information_schema.events limit 2,3\G*************************** 1. row ***************************       EVENT_CATALOG: def        EVENT_SCHEMA: test          EVENT_NAME: event_2             DEFINER: root@localhost           TIME_ZONE: SYSTEM          EVENT_BODY: SQL    EVENT_DEFINITION: BEGIN           insert into test.test2_event(username,password,create_time) values("李四","tomcat",now());    END          EVENT_TYPE: RECURRING          EXECUTE_AT: NULL      INTERVAL_VALUE: 5      INTERVAL_FIELD: SECOND            SQL_MODE: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION              STARTS: 2018-09-14 20:50:06                ENDS: NULL              STATUS: ENABLED       ON_COMPLETION: NOT PRESERVE             CREATED: 2018-09-14 20:48:06        LAST_ALTERED: 2018-09-14 20:48:06       LAST_EXECUTED: 2018-09-14 21:01:01       EVENT_COMMENT: xiaowu create          ORIGINATOR: 1131053306CHARACTER_SET_CLIENT: utf8COLLATION_CONNECTION: utf8_general_ci  DATABASE_COLLATION: utf8_general_ci*************************** 2. row ***************************       EVENT_CATALOG: def        EVENT_SCHEMA: test          EVENT_NAME: event_1             DEFINER: root@localhost           TIME_ZONE: SYSTEM          EVENT_BODY: SQL    EVENT_DEFINITION: insert into test.test1_event(username,password,create_time) values ("李四","tomcat",now())          EVENT_TYPE: RECURRING          EXECUTE_AT: NULL      INTERVAL_VALUE: 10      INTERVAL_FIELD: SECOND            SQL_MODE: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION              STARTS: 2018-09-14 20:49:55                ENDS: NULL              STATUS: DISABLED       ON_COMPLETION: NOT PRESERVE             CREATED: 2018-09-14 20:47:55        LAST_ALTERED: 2018-09-14 20:53:15       LAST_EXECUTED: 2018-09-14 20:53:05       EVENT_COMMENT:           ORIGINATOR: 1131053306CHARACTER_SET_CLIENT: utf8COLLATION_CONNECTION: utf8_general_ci  DATABASE_COLLATION: utf8_general_ci2 rows in set (0.00 sec)mysql>

关闭某个事件:

mysql> alter  event event_1 disable;Query OK, 0 rows affected (0.00 sec)

注意:手动关闭事件后,即使是重启MySQL,事件是不会重新启动的,必须登陆执行MySQL alter event event_1 enable; 来开启事件event_1.

手动开启某个事件

alter event event_1 enable;

删除某个事件:

drop event event_1;

实例2:

2分钟后清空test2_event表:

CREATE EVENT event_4ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 MINUTEDO TRUNCATE TABLE test.test2_event;表已经被清空了,但是之前的计划事件每秒插入一条记录到数据表仍然在继续执行mysql> select * from test2_event;+----+----------+----------+---------------------+| id | username | password | create_time         |+----+----------+----------+---------------------+|  1 | 李四     | tomcat   | 2018-09-14 21:12:26 ||  2 | 李四     | tomcat   | 2018-09-14 21:12:31 ||  3 | 李四     | tomcat   | 2018-09-14 21:12:36 ||  4 | 李四     | tomcat   | 2018-09-14 21:12:41 |+----+----------+----------+---------------------+4 rows in set (0.00 sec)

2018年9月06日17点15整点清空test表:

CREATE EVENT a_test ON SCHEDULE AT TIMESTAMP '2018-09-06 17:10:00'DO TRUNCATE TABLE test.aaa;

转载于:https://blog.51cto.com/wujianwei/2175454

你可能感兴趣的文章
php给图片加入文字水印
查看>>
iOS开发-sqlite3使用
查看>>
(5)QlikView中的RowNo()函数
查看>>
SiteMesh2-示例工程
查看>>
poj 1087 A Plug for UNIX 【最大流】
查看>>
Phoenix与Squirrel 是什么?
查看>>
Photoshop制作的ico图标方法
查看>>
HDU 1241 Oil Deposits (DFS)
查看>>
【翻译自mos文章】注意: ASMB process exiting due to lack of ASM file activity
查看>>
Linux 线程浅析
查看>>
ucgui界面设计演示样例2
查看>>
蓝桥杯练习系统——基础练习 十六进制转十进制
查看>>
jmeter学习记录--05--Beanshell2
查看>>
解决git pull 每一次都需要输入密码的问题
查看>>
Mac: Android studio+VirtualBox+Genymotion
查看>>
linux内核源码之基础准备篇
查看>>
Nginx Location配置总结
查看>>
SQL Server-聚焦过滤索引提高查询性能
查看>>
The way to Go(4): Go runtime及解释器
查看>>
Handler具体解释
查看>>