mysql简述事件的用途_MySQL之事件调度器简单应用

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

先来看一下它的语法:

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

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 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,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: 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: 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: 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值