MySQL事件(Event)

来源:互联网 发布:安倍经济学 知乎 编辑:程序博客网 时间:2024/06/11 09:01

1 事件简介

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

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

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

2 事件的优缺点
    2.1 优点

    一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。

    可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。

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

3 创建事件

    一条create event语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件调度(event schedule),表示事件何时启动以及按什么频率启动,第二部分是事件动作(event action ),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者benin…end语句块,这两种情况允许我们执行多条SQL。

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

    3.1 创建语法如下

[sql] view plain copy
print?
  1. CREATE  
  2.     [DEFINER = { user | CURRENT_USER }]  
  3.     EVENT  
  4.     [IF NOT EXISTS]  
  5.     event_name  
  6.     ON SCHEDULE schedule  
  7.     [ON COMPLETION [NOT] PRESERVE]  
  8.     [ENABLE | DISABLE | DISABLE ON SLAVE]  
  9.     [COMMENT ’comment’]  
  10.     DO event_body;  
  11.   
  12. schedule:  
  13.     AT timestamp [+ INTERVAL interval] …  
  14.   | EVERY interval  
  15.     [STARTS timestamp [+ INTERVAL interval] …]  
  16.     [ENDS timestamp [+ INTERVAL interval] …]  
  17.   
  18. interval:  
  19.     quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |  
  20.               WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |  
  21.               DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}  
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负责调用事件,它默认是关闭的。这个调度器不断地监视一个事件是否要调用, 要创建事件,必须打开调度器

[sql] view plain copy
print?
  1. mysql> show variables like ‘%event_scheduler%’;  
  2. +—————–+——-+  
  3. | Variable_name   | Value |  
  4. +—————–+——-+  
  5. | event_scheduler | OFF   |  
  6. +—————–+——-+  
mysql> show variables like '%event_scheduler%';+-----------------+-------+| Variable_name   | Value |+-----------------+-------+| event_scheduler | OFF   |+-----------------+-------+
        3.2.2 开启事件调度器

        通过命令行

        可通过如下任何一个命令行

[sql] view plain copy
print?
  1. SET GLOBAL event_scheduler = ON;  
  2. SET @@global.event_scheduler = ON;  
  3. SET GLOBAL event_scheduler = 1;  
  4. SET @@global.event_scheduler = 1;  
SET GLOBAL event_scheduler = ON;SET @@global.event_scheduler = ON;SET GLOBAL event_scheduler = 1;SET @@global.event_scheduler = 1;

        通过配置文件my.cnf

[sql] view plain copy
print?
  1. event_scheduler = 1 #或者ON  
event_scheduler = 1 #或者ON

        查看调度器线程

[sql] view plain copy
print?
  1. mysql> show processlist;  
  2. +—-+—————–+———–+——+———+——+————————+——————+  
  3. | Id | User            | Host      | db   | Command | Time | State                  | Info             |  
  4. +—-+—————–+———–+——+———+——+————————+——————+  
  5. |  2 | root            | localhost | NULL | Query   |    0 | NULL                   | show processlist |  
  6. |  3 | event_scheduler | localhost | NULL | Daemon  |    6 | Waiting on empty queue | NULL             |  
  7. +—-+—————–+———–+——+———+——+————————+——————+  
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 关闭事件调度器

        通过命令行

        可通过如下任何一个命令行

[sql] view plain copy
print?
  1. SET GLOBAL event_scheduler = OFF;  
  2. SET @@global.event_scheduler = OFF;  
  3. SET GLOBAL event_scheduler = 0;  
  4. SET @@global.event_scheduler = 0;  
SET GLOBAL event_scheduler = OFF;SET @@global.event_scheduler = OFF;SET GLOBAL event_scheduler = 0;SET @@global.event_scheduler = 0;

        通过配置文件my.cnf

        在[mysqld]下增加

[sql] view plain copy
print?
  1. event_scheduler = 0 #或者OFF,DISABLED  
event_scheduler = 0 #或者OFF,DISABLED

         查看调度器线程

[sql] view plain copy
print?
  1. mysql> show processlist;  
  2. +—-+——+———–+——+———+——+——-+——————+  
  3. | Id | User | Host      | db   | Command | Time | State | Info             |  
  4. +—-+——+———–+——+———+——+——-+——————+  
  5. |  2 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |  
  6. +—-+——+———–+——+———+——+——-+——————+  
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 创建测试表

[sql] view plain copy
print?
  1. mysql> drop table if exists events_list;  
  2. mysql> create table events_list(event_name varchar(20) not null, event_started timestamp not null);  
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(立即启动事件)

[sql] view plain copy
print?
  1. create event event_now   
  2. on schedule   
  3. at now()   
  4. do insert into events_list values(‘event_now’, now());  
create event event_now on schedule at now() do insert into events_list values('event_now', now());
    查看事件执行结果

[sql] view plain copy
print?
  1. mysql> select * from events_list;  
  2. +————+———————+  
  3. | event_name | event_started       |  
  4. +————+———————+  
  5. | event_now  | 2014-07-01 04:06:40 |  
  6. +————+———————+  
mysql> select * from events_list;+------------+---------------------+| event_name | event_started       |+------------+---------------------+| event_now  | 2014-07-01 04:06:40 |+------------+---------------------+

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

[sql] view plain copy
print?
  1. create event test.event_minute   
  2. on schedule   
  3. every  1 minute    
  4. do insert into events_list values(‘event_now’, now());  
create event test.event_minute on schedule every  1 minute  do insert into events_list values('event_now', now());

    查看事件执行结果

[sql] view plain copy
print?
  1. mysql> select * from events_list;  
  2. +————+———————+  
  3. | event_name | event_started       |  
  4. +————+———————+  
  5. | event_now  | 2014-07-01 04:26:53 |  
  6. | event_now  | 2014-07-01 04:27:53 |  
  7. | event_now  | 2014-07-01 04:28:53 |  
  8. +————+———————+  
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.4 注意:

    默认创建事件存储在当前库中,也可显示指定事件创建在哪个库中

    通过show events只能查看当前库中创建的事件

    事件执行完即释放,如立即执行事件,执行完后,事件便自动删除,多次调用事件或等待执行事件可以查看到。

    如果两个事件需要在同一时刻调用,mysql会确定调用他们的顺序,如果要指定顺序,需要确保一个事件至少在另一个事件1秒后执行

    对于递归调度的事件,结束日期不能在开始日期之前。

    select可以包含在一个事件中,然而他的结果消失了,就好像没执行过。

4 查看事件

    查看当前所在库的事件

[sql] view plain copy
print?
  1. mysql> show events;  
mysql> show events;

    查看所有事件

[sql] view plain copy
print?
  1. mysql> select * from mysql.event;  
mysql> select * from mysql.event;

5 修改事件

    一条alter event语句可以修改事件的定义和属性。我们可以让一个事件成为停止的或者再次让它活动,也可以修改一个事件的名字或者整个调度。然而当一个使用 ON COMPLETION NOT PRESERVE 属性定义的事件最后一次执行后,事件直接就不存在了,不能修改。

    5.1 语法如下:

[sql] view plain copy
print?
  1. ALTER  
  2.     [DEFINER = { user | CURRENT_USER }]  
  3.     EVENT event_name  
  4.     [ON SCHEDULE schedule]  
  5.     [ON COMPLETION [NOT] PRESERVE]  
  6.     [RENAME TO new_event_name]  
  7.     [ENABLE | DISABLE | DISABLE ON SLAVE]  
  8.     [COMMENT ’comment’]  
  9.     [DO event_body]  
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]

    5.2 例如

    修改上面例子3.3.3 每分钟启动事件为每30秒启动

[sql] view plain copy
print?
  1. alter event test.event_minute  
  2. on schedule   
  3. every  30 second    
  4. do insert into events_list values(‘event_now’, now());  
alter event test.event_minuteon schedule every  30 second  do insert into events_list values('event_now', now());

    修改上面例子3.3.3 事件名字为event_second

[sql] view plain copy
print?
  1. alter event test.event_minute   
  2. rename to test.event_second;  
alter event test.event_minute rename to test.event_second;

    修改上面例子3.3.3 事件为不活动和再次活动

[sql] view plain copy
print?
  1. alter event test.event_second disable;  
  2. alter event test.event_second enable;  
alter event test.event_second disable;alter event test.event_second enable;

    6 删除事件

    如果一个事件不再需要,我们可以使用一条drop event 语句删除它。使用这条语句我们不需要等到最后一次事件调用。

    6.1 基本语法

[sql] view plain copy
print?
  1. DROP EVENT [IF EXISTS] event_name  
DROP EVENT [IF EXISTS] event_name

    6.2 例如

[sql] view plain copy
print?
  1. drop event if exists event_second;  
drop event if exists event_second;

7 事件和权限

8 更多详细案例

   

<关键字:event>

**********************************************************************************************
 转载请注明出处:http://blog.csdn.net/jesseyoung/article/details/35257527
**********************************************************************************************

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 超市买的尿不湿质量太差怎么办 把卫生巾和衣服一起洗了怎么办 全面屏面对vo华为手机怎么办屏 雅漾喷雾的喷头坏了怎么办 悦诗风吟水里面有小颗粒怎么办 林肯mkz钥匙锁在车内怎么办 八四消毒液弄到衣服上怎么办 微信朋友圈发过的文章想修改怎么办 白色衣服被洗衣液染色了怎么办 准迁证和迁移证不想迁了怎么办 出了迁移证又想迁到其他地方怎么办 高中的会考如果没g合格怎么办 鞋子里自带的鞋垫坏了怎么办 入厕纸把私处伤了一下怎么办? 夏天做月子用姨妈巾热怎么办 涂了痔疮膏后怕粘到内裤怎么办 眼罩里面的蓝色液体干了怎么办 新买的饮水机有塑料味怎么办 白色衣服被洗衣液染荧光了怎么办 衣服碰到了酒店的毛巾被单怎么办 防晒喷雾弄衣服上有荧光怎么办 剑网3重置版删除后有残留怎么办 在超市买到变质的水果怎么办 微信官方电话一直打不通怎么办 对方欠货款股东换了不还怎么办 闲鱼买的东西确认收货有问题怎么办 不让微信好友看到吃鸡的名字怎么办 金鹰贵宾积分卡过期了怎么办 小宝机器人一直停在联网界面怎么办 手机版的有道云笔记忘记邮箱怎么办 钡灌肠复查钡剂排空不良怎么办 两个月宝宝灌肠后不排便怎么办 一岁宝宝肠套叠灌肠后拉肚子怎么办 苹果手机自带的天气没有了怎么办? 衣服在洗衣机里忘记拿出来怎么办 苹果se手机系统占内存太大怎么办 客人把饭店老板打了民警怎么办 商场嫌品牌低端不让入驻怎么办 带着孩子坐飞机座位不在一起怎么办 公司老板跑路了员工该怎么办 超市买的衣服防盗扣忘记取了怎么办