MySQL之事件调度器简单应用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL之事件调度器简单应用相关的知识,希望对你有一定的参考价值。
一.mysql之事件调度器语法详解
创建,修改,查看等语法参考官网文档链接,http://dev.mysql.com/doc/refman/5.6/en/create-event.html
创建事件(CREATE EVENT)
先来看一下它的语法:
CREATE EVENT [IF NOT EXISTS] event_name
ON 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_name
ON SCHEDULE <schedule>
DO <event_body>;
实例一:
首先来看一个简单的例子:
创建测试表:
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 SECOND
STARTS CURRENT_TIMESTAMP + INTERVAL 2 MINUTE
DO 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 MINUTE
COMMENT ‘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,3G
*************************** 1. row ***************************
EVENT_CATALOG: def
EVENT_SCHEMA: test
EVENT_NAME: event_2
DEFINER: [email protected]
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: 1131053306
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
*************************** 2. row ***************************
EVENT_CATALOG: def
EVENT_SCHEMA: test
EVENT_NAME: event_1
DEFINER: [email protected]
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: 1131053306
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
2 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_4
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 MINUTE
DO 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;
以上是关于MySQL之事件调度器简单应用的主要内容,如果未能解决你的问题,请参考以下文章