MYSQL定时执行事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL定时执行事件相关的知识,希望对你有一定的参考价值。

请问怎样实现mysql 定时事件。

比如 一个表中。一个字段ID=1 怎样让这个字段 在1分钟后更新为ID=20且只是执行一次。 或者在这个字段上实现 各一秒递减一次。 ID = ID-1执行到ID=0 为止。 这种。 求大佬帮助!!

mysql要实现定时执行sql语句就要用到Event

具体操作如下:

先看看看event 事件是否开启
show variables like '%sche%';

如没开启,则开启。需要数据库超级权限
set global event_scheduler =1;

创建存储过程 update_a (注:就是你要执行的sql语句)
mysql> create procedure update_a() update a set a.y_avg=(select avg(b.youhao) from b where a.a_id=b.a_id);

创建一个定时任务:event e_updateA
mysql> create event if not exists e_updateA
-> on schedule every 60 second ---设置60秒执行一次

-> on schedule at date_add(now(),interval 1 minute) ---在一分钟后执行

-> on completion preserve
-> do call update_a(); ---执行update_a()存储过程

创建Event之后,sql语句就定时执行一次。

关闭事件任务
参考技术A MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件、定时任务机制,在指定的时间单元内执行特定的任务,因此今后一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。

mysql 定时任务的使用

mysql5.1.6增加了一个事件调度器(Event Scheduler),可以做定时任务(定时删除记录,定时数据统计),取代之前系统的计划任务。mysql事件调度器可以精确到每秒执行一个任务。

事件调度器与触发器的区别:事件调度器是基于特定时间周期来触发执行某些任务,触发器是基于某个表产生的事件来触发。

 

一、查看是否开启

> show variables like \'event_scheduler\';

二、开启事件调度器

set global event_scheduler = on;

 这里的设置,当mysql重启后,又会自动关闭。如果需要一直开启,需要在my.ini中配置如下:

event_scheduler = on

三、创建事件语法

CREATE EVENT [IF NOT EXISTS ] event_name 
ON SCHEDULE schedule 
[ ON COMPLETION [ NOT ] PRESERVE ] 
[ ENABLE | DISABLE ] 
[ COMMENT \'注释\' ] 
DO SQL语句;

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 }

event_name:事件名,最大长度64个字符。

schedule:执行时间。

[ ON COMPLETION [ NOT ] PRESERVE ] :事件是否需要复用。

[ ENABLE | DISABLE ] :事件开启或关闭。

四、关闭事件

ALTER EVENT event_name DISABLE;

五、开启事件

ALTER EVENT event_name ENABLE;

六、删除事件

DROP EVENT [IF EXISTS ] event_name;

七、查看所有事件

SHOW EVENTS; 

八、事件例子

我们先创建一个简单的test表用于测试

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT \'ID\',
  `now` datetime DEFAULT NULL COMMENT \'时间\',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

事件类型有两种,一种是间隔触发,一种是特定时间触发

我们每隔一秒向test表插入一条记录:

DROP EVENT IF EXISTS event_test;
CREATE EVENT event_test 
ON SCHEDULE EVERY 1 SECOND STARTS \'2017-08-22 11:57:00\' ENDS \'2017-08-22 12:00:00\'
ON COMPLETION PRESERVE 
ENABLE 
COMMENT \'每隔一秒向test表插入记录\'
DO INSERT INTO test VALUES(NULL, now());

我们指定时间来向test表插入一条记录:

DROP EVENT IF EXISTS event_test2;
CREATE EVENT event_test2
ON SCHEDULE AT \'2017-08-22 12:01:00\'
ON COMPLETION PRESERVE 
ENABLE 
COMMENT \'指定时间向test表插入记录\'
DO INSERT INTO test VALUES(999999, now());

 

以上是关于MYSQL定时执行事件的主要内容,如果未能解决你的问题,请参考以下文章

mysql 自动执行事件

mysql 定时任务的使用

Mysql定时任务详情

MYSQL利用事件和存储过程实现执行定时任务

如何写mysql的定时任务

mysql开启定时调度任务执行