mysql定时任务(event事件)

1.事件简介

事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。

事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于他们彼此相似,所以事件也称为临时性触发器。

事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。

2 事件的优缺点
2.1 优点
一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。
可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。

2.2 缺点
定时触发,不可以调用。

3 创建事件

一条create event语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件调度(eventschedule,表示事件何时启动以及按什么频率启动;

第二部分是事件动作(event action),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者
benin...end语句块,这两种情况允许我们执行多条SQL。

一个事件可以是活动(打开)的或停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中,但调度器不会检查它是否应该调用。在一个事件创建之后,它立即变为活动的,一个活动的事件可以执行一次或者多次。

3.1 创建语法如下

    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} 

名词解释:
event_name :创建的event名字(唯一确定的)。
ON SCHEDULE:计划任务。
schedule: 决定event的执行时间和频率(注意时间一定要是将来的时间,过去的时间会出错),有两种形式 AT和EVERY。
[ON COMPLETION [NOT] PRESERVE]: 可选项,默认是ON COMPLETION NOT PRESERVE 即计划任务执行完毕后自动drop该事件;ON COMPLETION PRESERVE则不会drop掉。
[COMMENT ‘comment‘] :可选项,comment 用来描述event;相当注释,最大长度64个字节。
[ENABLE | DISABLE] :设定event的状态,默认ENABLE:表示系统尝试执行这个事件, DISABLE:关闭该事情,可以用alter修改
DO event_body: 需要执行的sql语句(可以是复合语句)。CREATE EVENT在存储过程中使用时合法的。

3.2 开启关闭事件调度器
3.2.1 MySQL事件调度器event_scheduler负责调用事件,它默认是关闭的。这个调度器不断地监视一个事件是否要调用, 要创建事件,必须打开调度器。

mysql> show variables like ‘%event_scheduler%‘;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+

3.2.2 开启事件调度器
通过命令行
可通过如下任何一个命令行

SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;

通过配置文件my.cnf

event_scheduler = 1 #或者ON

查看调度器线程

mysql> show processlist;
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
| Id | User            | Host      | db   | Command | Time | State                  | Info             |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
|  2 | root            | localhost | NULL | Query   |    0 | NULL                   | show processlist |
|  3 | event_scheduler | localhost | NULL | Daemon  |    6 | Waiting on empty queue | NULL|
+----+-----------------+-----------+------+---------+------+------------------------+------------------+

3.2.3 关闭事件调度器
通过命令行
可通过如下任何一个命令行

SET GLOBAL event_scheduler = OFF;
SET @@global.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@global.event_scheduler = 0;

通过配置文件my.cnf
在[mysqld]下增加

event_scheduler = 0 #或者OFF,DISABLED

查看调度器线程

mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
|  2 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+

3.3 例如:创建一个表记录每次事件调度的名字和事件戳
3.3.1 创建测试表

mysql> drop table if exists events_list;
mysql> create table events_list(event_name varchar(20) not null, event_started timestamp not null);

3.3.2 创建事件1(立即启动事件)

create event event_now
on schedule
at now()
do insert into events_list values(‘event_now‘, now());

查看事件执行结果

mysql> select * from events_list;
+------------+---------------------+
| event_name | event_started       |
+------------+---------------------+
| event_now  | 2014-07-01 04:06:40 |
+------------+---------------------+

3.3.3 创建事件2(每分钟启动事件)

create event test.event_minute
on schedule
every  1 minute
do insert into events_list values(‘event_now‘, now());

查看事件执行结果

mysql> select * from events_list;
+------------+---------------------+
| event_name | event_started       |
+------------+---------------------+
| event_now  | 2014-07-01 04:26:53 |
| event_now  | 2014-07-01 04:27:53 |
| event_now  | 2014-07-01 04:28:53 |
+------------+---------------------+

3.3.3 创建事件3(每秒钟启动事件)

CREATE event event_now
ON SCHEDULE
EVERY 1 SECOND
DO INSERT INTO event_test VALUES(1);

3.3.4 创建事件4(每秒钟调用存储过程)

CREATE DEFINER=`root`@`localhost` EVENT `eventUpdateStatus`
ON SCHEDULE EVERY 1 SECOND
STARTS ‘2017-11-21 00:12:44‘
ON COMPLETION PRESERVE
ENABLE
DO call updateStatus()

3.4 注意:
默认创建事件存储在当前库中,也可显示指定事件创建在哪个库中
通过show events只能查看当前库中创建的事件
事件执行完即释放,如立即执行事件,执行完后,事件便自动删除,多次调用事件或等待执行事件可以查看到。
如果两个事件需要在同一时刻调用,mysql会确定调用他们的顺序,如果要指定顺序,需要确保一个事件至少在另一个事件1秒后执行
对于递归调度的事件,结束日期不能在开始日期之前。
select可以包含在一个事件中,然而他的结果消失了,就好像没执行过。

4 查看事件
查看当前所在库的事件
mysql> show events;
查看所有事件
mysql> select * from mysql.event;

历史文章:
JAVA微信企业付款到零钱(十分钟搞定)
微信授权获取用户openId的方法和步骤
一个微信号同时支持多个环境网页授权
微信两种签名算法MD5和HMAC-SHA256

原文地址:https://www.cnblogs.com/angryjj/p/11324590.html

时间: 2024-09-29 09:03:04

mysql定时任务(event事件)的相关文章

MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据) 分类: MySql5.x2014-06-23 15:16 1266人阅读 评论(0) 收藏 举报 mysql数据库 [sql] view plaincopy <span style="font-family: 'Microsoft YaHei'; font-size: 14px;">MySQL定时任务event</span> 由于一些业务需求,我们可能需要定时清除数据库一些废弃的数据

【MySQL】Event事件与游标

MySQL的事件就像Linux系统上的定时任务,按照设置的时间或者间隔时间执行设置好的任务. 如果用SQLyog一类的写存储过程.触发器或者事件会省事一些,例如SQLyog就会生成一个大致的模板: 1 DELIMITER $$ 2 CREATE EVENT `report`.`monitor_user4cx` ON SCHEDULE EVERY 15 MINUTE DO 3 BEGIN 4 DECLARE cx_id INT(10); 5 DECLARE t_query VARCHAR(500)

mysql定时任务event——清理过期数据 (转)

1.查询是否开启事件调度 SHOW VARIABLES LIKE 'event_scheduler'; 2.开启事件调度 临时: SET GLOBAL event_scheduler = 1; 永久: vim /etc/my.cnf event_scheduler=ON [mysqld]event_scheduler=ON //这一行加入mysqld标签下 3.创建p_del_count存储过程. 接收传入参数30并执行删除数据操作,删除大于30天的数据. drop procedure if e

MySQL job/定时任务/event 学习

参考文章: https://blog.csdn.net/qq_21108311/article/details/82589850 https://blog.csdn.net/qq_27238185/article/details/56271877 https://blog.csdn.net/lxpbs8851/article/details/8019965 概要简述 原文链接:https://blog.csdn.net/qq_21108311/article/details/82589850 M

mysql 定时任务和存储过程

mysql 定时任务和存储过程 最近在做日志系统,中间用到了 mysql, 其中有一个要求: 把数据库中 7天之后的日志清除了.看到 mysql 也支持 定时任务.于是就用 mysql 来做了.下面就是这次使用代码. 存储过程 use webapm; --创建存储过程 DELIMITER $$ CREATE PROCEDURE `p_del_slow`(IN `date_inter` INT) BEGIN DELETE FROM slow_duration WHERE (TO_DAYS(NOW(

MySQL之event的介绍

MySQL5.1.6版本中引入了一项新特性EVENT,顾名思义就是事件.定时任务机制,在指定的时间单元内执行特定的任务,因此今后一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能.其实MySQL的EVENT 功能和linux下的的at.crontab或Windows下的Task Scheduler计划任务类似. 也被称为MySQL事件调度器(Event Scheduler),可以在某一个时间点执行一个SQL语句或一个语句块(BEGIN ... END):或者每隔固定间隔重复执行

Mysql定时任务详情

Mysql定时任务 1.查看是否开启事件调度器: SHOW VARIABLES LIKE 'event_scheduler'; #没有开启则无法启用定时器(0代表:off,1代表:on)#若未开启则执行SET GLOBAL event_scheduler = ON; #开启定时器 2.创建EVENT事件语法: #例.每隔10秒执行一次 CREATE EVENT 定时器名称 #event事件名 ON SCHEDULE EVERY 10 SECODE #每隔10秒调度一次(事件可以自行设置[例:MO

mysql定时任务配置

做项目有时会遇到一些状态需要每天定时去维护,我的方案是写成sql语句或者存储过程,再配置mysql调度器让数据库每天去执行.废话不多说,直接进去正文: 假如当前时间是2016-12-28 12:05:00,你执行下面语句,等到12:10时,系统自动执行调度任务去往aaa表里insert一条记录. Select @@event_scheduler;#查看事件调度程序,如果是OFF,则执行下条语句SET GLOBAL event_scheduler = ON;#设置时间调度程序为ON#每天的2016

Mysql中Event的一些测试

Mysql的event schedule可以让你设置你的mysql数据库在某个时间段执行你想要的动作create event test1on schedule every 1 daystarts '2007-09-01 12:00:00'on completion not preservedo insert into yyy values('hhh','uuu');或create event teston schedule at '2007-09-01 12:00:00' + interval