event
在linux中我们可以使用at或者crontab实现计划任务和周期性任务,那么在mysql中如何实现呢?
在mysql中使用event对象可以实现以下两种需求
(1)在12点钟,执行一个begin and
(2)从12点开始,每隔一个小时,执行一个begin and
1.event对象
调度分为两种:一种是执行一次的,一种是周期性的
对于周期性的调度,我们可以指定周期的开始,周期的结束,每隔多长时间(每分钟,每秒,每天,每个季度,每周),一般我们都指定周期的开始和每隔多长时间,周期的结束一般不指定;没有指定周期的开始,就是从现在开始,没有定义周期的结束,就是永远都不结束;每隔多长时间必须指定
2.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}
释义:AT timestamp [+ INTERVAL interval] …表示一个时间加上一个时间间隔,是固定的时间点
- INTERVAL 1:5 YEAR_MONTH表示为1年5个月
3.event的开关
要想使event生效,必须将参数打开
(1)set global event_scheduler =1;
(2)重启
(3)mysql> show variables like ‘%event_scheduler%’;
±----------------±------+
| Variable_name | Value |
±----------------±------+
| event_scheduler | ON | ##on说明打开
±----------------±------+
4.通过示例深入了解event
示例:需求是每隔一分钟插入数据
create table t2(id int auto_increment primary key,t_time datetime);
delimiter $$
CREATE EVENT e_daily
ON SCHEDULE
EVERY 1 MINUTE ##执行的时间,当前是每隔一分钟
COMMENT ‘Saves total number of sessions then clears the table each day’
DO
BEGIN
INSERT INTO t2 values (null,current_timestamp); ##执行的计划是什么
END $$
delimiter ;
mysql> select EVENT_NAME,LAST_EXECUTED from information_schema.EVENTS;
±-----------±--------------------+
| EVENT_NAME | LAST_EXECUTED |
±-----------±--------------------+
| e_daily | 2016-01-17 18:53:09 |
±-----------±--------------------+
1 row in set (0.00 sec)
示例2:需求是一分钟后执行一个更新语句,执行一次就可以
delimiter $$
CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE ##当前时间加上一分钟
DO
begin
UPDATE t1 SET mycol = mycol + 1; ##将t1表中的mycol列的数据加1
end$$
delimiter ;
show events; ##将events的详细信息显示出来
/var/log/mysqld.log (或者是/usr/local/mysql/data/mysqld.log) ##可以查看mysql的日志文件, 来获取event的执行情况
2016-01-17T10:40:52.018009Z 10 [Note] Event Scheduler: scheduler thread started with id 10
补充:使用tail -f 可以动态查看文件末尾的内容
5.补充event
mysql> select EVENT_NAME,LAST_EXECUTED from information_schema.EVENTS;
语句释义:可以看到定义的event最后一次执行的时间