MySQL事件调度器event的使用
Q:假设,有一个需求,希望在某一个时刻系统调用一个begin end执行一下;十分钟以后执行一下begin end。亦或有一个需求,每个多长时间周期性执行begin end。那么这个时候该怎么办呢?
A:
在Linux里面可以使用at、crontab来实现上面的需求;MySQL里面也有这样的方法,就是event对象。
也被称为MySQL事件调度器(Event Scheduler),可以在某一个时间点执行一个SQL语句或一个语句块(BEGIN ... END);或者每隔固定间隔重复执行。类似于Linux下的at、crontab或Windows下的Task Scheduler。
那么如何使用event,步骤如下:
1、开启数据库的event执行调度
> 查看是否开启定时器
mysql> show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
>开启
0:off
1:on
mysql> set global event_scheduler=;
mysql> exit
Bye [root@studying ~]# mysql -uroot -p123
mysql> show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
注意:
如果是设定事件计划为0 或OFF,即关闭事件计划进程的时候,不会有新的事件执行,但现有的正在运行的事件会执行到完毕。
对于线上环境来说,使用even时,注意在主库上开启定时器,从库上关闭定时器,event触发所有操作均会记录binlog进行主从同步,从库上开启定时器很可能造成卡库。切换主库后之后记得将新主库上的定时器打开。
2、CREATE EVENT创建
CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
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}
详细解析:
①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关键字来禁用该事件。
⑥comment子句用于给事件添加注释。
⑦do子句用于指示事件需要执行的操作,可以是一条SQL语句,也可以是被begin...end包括的语句块,也可以在语句块中调用存储过程。
基本格式:
CREATE EVENT event_name
ON SCHEDULE <schedule>
DO <event_body>;
mysql> create event my_event
-> on schedule every second
-> do update myschema.mytable set mycol = mycol + ;
示例:建立一个计划任务,每分钟往表t2中添加数据(当前时间)
mysql> show events;
Empty set (0.02 sec) mysql> create table t2(id int auto_increment primary key,t_time datetime); mysql> delimiter $$
mysql> CREATE EVENT e_daily
-> ON SCHEDULE
-> EVERY MINUTE
-> COMMENT 'Saves total number of sessions then clears the table each day'
-> DO
-> BEGIN
-> INSERT INTO t2 values (null,current_timestamp);
-> END $$
mysql> delimiter ; ……过一段时间…… mysql> select * from t2;
+----+---------------------+
| id | t_time |
+----+---------------------+
| | -- :: |
| | -- :: |
| | -- :: | …………
3、查看新建的计划任务
mysql> select EVENT_NAME,LAST_EXECUTED from information_schema.EVENTS;
+------------+---------------------+
| EVENT_NAME | LAST_EXECUTED |
+------------+---------------------+
| e_daily | -- :: |
+------------+---------------------+ mysql> show events\G;
*************************** . row ***************************
Db: db1
Name: e_daily
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value:
Interval field: MINUTE
Starts: -- ::
Ends: NULL
Status: ENABLED
Originator:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci [root@studying ~]# tail - /var/log/mysqld.log
--04T08::.311514Z [Note] Event Scheduler: scheduler thread started with id
通过查看MySQL日志,查看执行情况 。
4、修改alter event
ALTER
[DEFINER = { user | CURRENT_USER }]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
[DO event_body]
alter event语句可以修改事件的一个或多个属性,语法与create event语句完全相同,唯一不同的是可以对事件重命名,使用RENAME TO子句。
例如:
ALTER EVENT OLDDB.MYEVENT RENAME TO NEWDB.MYEVENT;
5、删drop event
DROP EVENT [IF EXISTS] event_name;
删除一个定义的事件。
MySQL事件调度器event的使用的更多相关文章
- MySQL事件调度器Event Scheduler
我们都知道windows的计划任务和linux的crontab都是用来实现一些周期性的任务和固定时间须要运行的任务. 在mysql5.1之前我们完毕数据库的周期性操作都必须借助这些操作系统实现. 在m ...
- mysql事件调度器定时删除binlog
MySQL5.1.6起Mysql增加了事件调度器(Event Scheduler),可以用做定时执行某些特定任务,来取代原先只能由Linux操作系统的计划任务来执行的工作MySQL的事件调度器可以精确 ...
- mysql事件调度器功能
一.前言 自MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录.对数据进行汇总等等),来取代原先只能由操作系 ...
- mysql 事件调度器
1.mysql事件调度器,也就是计划任务,计划做某事,有两种方式: 2.在某个时间点做某事,AT TIMESTAMP [+ INTERVAL INTERVAL] 某个时间点加上偏移. 3.定时地做某事 ...
- mysql事件调度器
#查看mysql事件调度器是否开启 SHOW VARIABLES WHERE Variable_name = 'event_scheduler'; #开启mysql事件调度器功能 SET GLOBAL ...
- MySQL计划任务(事件调度器)(Event Scheduler)
http://www.cnblogs.com/c840136/articles/2388512.html https://dev.mysql.com/doc/refman/5.7/en/events- ...
- MySQL计划任务(事件调度器)(Event Scheduler)[转]
原文链接: http://www.cnblogs.com/c840136/articles/2388512.html MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务机 ...
- mysql事件调度器使用
--设置事件调度器 开启SET GLOBAL event_scheduler = ON; --查看事件调度器 是否开启 on开 off关SHOW VARIABLES LIKE 'event_sche ...
- Mysql事件调度器学习
在cassandra数据库中,有一个叫做TTL的功能,即插入一条记录时,可以指定某一字段对应的TTL值,比如30s,那么当TTL到达30s后该条记录就会被自动删除.目前MySQL并未直接提供TTL的功 ...
随机推荐
- Android开发之Notification的简单使用
创建Notification Buider 一个Builder至少包含以下内容: 一个小的icon,用setSmallIcon())方法设置 一个标题,用setContentTitle())方法 ...
- iOS开发之UIPickerView
1.使用方法 UIPickerView使用和UITableView大致类似.首先设置ViewController为数据源,然后遵守数据源协议< UIPickerViewDataRecouce&g ...
- 初识vuex
1.简介 vuex是 vue官方推荐的一个状态管理器.当我们遇到很多状态改变时,组件之间的通信就会变得复杂,这时候vuex的强大就展现出来. 我们从vuex的原理以及vuex的api两个部分介绍vue ...
- QQ登陆接口
这次做了一个QQ登陆接口---简单记录一下 遇到一大坑-----QQ互联里面添加应用的时候,是网站应用,配置回调地址一定要配置 准确,到指定回调页面 否则会出现问题的.
- 【C++】模拟实现auto_ptr
看了<Effctive C++>,里面提到用对象去管理资源,可以有效防止内存泄漏. 结合auto_ptr特性,稍微思考了一下,实现了一个简单的auto_ptr (因为代码量小,就不分文件了 ...
- 程序猿 tensorflow 入门开发及人工智能实战
tensorflow 中文文档: http://www.tensorfly.cn http://wiki.jikexueyuan.com/project/tensorflow-zh/ tensorfl ...
- JS中的bind的实现以及使用
在讨论bind()方法之前我们先来看一道题目: var altwrite = document.write; altwrite("hello"); //1.以上代码有什么问题 // ...
- git常见操作和常见错误
最近写了个博客demo,在上传至github时,居然报错了,刚开始学习代码上传,免不了遇到一些问题,报错信息如下: fatal: remote origin already exists. (致命错误 ...
- PHP对象相关知识点的总结
对象传递:一种说法是"PHP对象是通过引用传递的",更准确的说法是别名(标识符)传递,即它们都保存着同一个标识符(ID)的拷贝,这个标识符指向同一个对象的真正内容. <?ph ...
- 读书笔记 effective c++ Item 45 使用成员函数模板来接受“所有兼容类型”
智能指针的行为像是指针,但是没有提供加的功能.例如,Item 13中解释了如何使用标准auto_ptr和tr1::shared_ptr指针在正确的时间自动删除堆上的资源.STL容器中的迭代器基本上都是 ...