mysql事件_mysql事件作用 - CSDN
精华内容
参与话题
  • MySql事件

    千次阅读 2016-02-17 15:40:19
    今天碰到了要求系统自动删除一个月之前的日志...Mysql事件学习 在系统管理或者数据库管理中,经常要周期性的执行某一个命令或者SQL语句。对于linux系统熟悉的人都知道linux的cron计划任务,能很方便地实现定期运行指定

    今天碰到了要求系统自动删除一个月之前的日志记录的需求,日志存在mysql数据库表中,之前的做法都是利用linux crontab定时任务去完成,今天突然发现了mysql的事件机制,便记录下来,分享给大家和自己。

    Mysql事件学习

    在系统管理或者数据库管理中,经常要周期性的执行某一个命令或者SQL语句。对于linux系统熟悉的人都知道linux的cron计划任务,能很方便地实现定期运行指定命令的功能。Mysql在5.1以后推出了事件调度器(Event Scheduler),和linux的cron功能一样,能方便地实现 mysql数据库的计划任务,而且能精确到秒。使用起来非常简单和方便。

    由于最近需要用到事件这个功能,因此学习了一下,感觉非常棒,总结一下,方便以后使用,也希望能对其他的初学者有帮助。

    一、   如果开启事件

    在使用事件这个功能,首先要保证你的mysql的版本是5.1以上,然后还要查看你的mysql服务器上的事件是否开启。

    查看事件是否开启,使用如下命令查看:

    SHOW VARIABLES LIKE 'event_scheduler';

    SELECT @@event_scheduler;

    SHOW PROCESSLIST;

    如果看到event_scheduler为on或者PROCESSLIST中显示有event_scheduler的信息说明就已经开启了事件。如果显示为off或者在PROCESSLIST中查看不到event_scheduler的信息,那么就说明事件没有开启,我们需要开启它。

    开启mysql的事件,通过如下三种方式开启:

    Ø  通过动态参数修改

    SET GLOBAL event_scheduler = ON;

    更改完这个参数就立刻生效了

    注意:还是要在my.cnf中添加event_scheduler=ON。因为如果没有添加的话,mysql重启事件又会回到原来的状态了。

    Ø  更改配置文件然后重启

    在my.cnf中的[mysqld]部分添加如下内容,然后重启mysql。

    event_scheduler=ON

    Ø  通过制定事件参数启动

    mysqld ... --event_scheduler=ON

     

    二、   Mysql事件的语法简介

    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}

    参数详细说明:

    DEFINER: 定义事件执行的时候检查权限的用户。

    ON SCHEDULE schedule: 定义执行的时间和时间间隔。

    ON COMPLETION [NOT] PRESERVE: 定义事件是一次执行还是永久执行,默认为一次执行,即NOT PRESERVE。

    ENABLE | DISABLE | DISABLE ON SLAVE: 定义事件创建以后是开启还是关闭,以及在从上关闭。如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE。

    COMMENT 'comment': 定义事件的注释。

     

    2.       更改事件的语法

    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]

    3.       删除事件的语法

    DROP EVENT [IF EXISTS] event_name

    三、   Mysql事件实战

    1.        测试环境

    创建一个用于测试的test表:

    CREATE TABLE `test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `t1` datetime DEFAULT NULL,
      `id2` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8

    2.        实战1

    Ø  创建一个每隔3秒往test表中插入一条数据的事件,代码如下(自我测试了下貌似有错,不能执行,自己修改下吧,可以看##########下面的内容):

    CREATE EVENT IF NOT EXISTS test ON SCHEDULE EVERY 3 SECOND

    ON COMPLETION PRESERVE

    DO INSERT INTO test(id,t1)VALUES('',NOW());

    Ø  创建一个10分钟后清空test表数据的事件

    CREATE EVENT IF NOT EXISTS test

    ON SCHEDULE

    AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE

    DO TRUNCATE TABLE test.aaa;

    Ø  创建一个在2012-08-2300:00:00时刻清空test表数据的事件,代码如下:

    CREATE EVENT IF NOT EXISTS test

    ON SCHEDULE

    AT TIMESTAMP '2012-08-23 00:00:00'

    DO TRUNCATE TABLE test;

    Ø  创建一个从2012年8月22日21点45分开始到10分钟后结束,运行每隔3秒往test表中插入一条数据的事件,代码如下:

    CREATE EVENT IF NOT EXISTS test ON SCHEDULE EVERY 3 SECOND

    STARTS '2012-08-22 21:49:00' 

    ENDS '2012-08-22 21:49:00'+ INTERVAL 10 MINUTE

    ON COMPLETION PRESERVE

    DO INSERT INTO test(id,t1) VALUES('',NOW());

     

    3.        实战2

    通常的应用场景是通过事件来定期的调用存储过程,下面是一个简单的示例:

    创建一个让test表的id2字段每行加基数2的存储过程,存储过程代码如下:

    DROP PROCEDURE IF EXISTS test_add;

    DELIMITER //

    CREATE PROCEDURE test_add()

    BEGIN

    DECLARE 1_id INT DEFAULT 1;

    DECLARE 1_id2 INT DEFAULT 0;

    DECLARE error_status INT DEFAULT 0;

    DECLARE datas CURSOR  FOR SELECT id FROM test;

    DECLARE CONTINUE HANDLER FOR NOTFOUND SET error_status=1;

    OPEN datas;

    FETCH datas INTO 1_id;

    REPEAT

    SET 1_id2=1_id2+2;

    UPDATE test SET id2=1_id2 WHEREid=1_id;

    FETCH datas INTO 1_id;

    UNTIL error_status

    END REPEAT;

    CLOSE datas;

    END

    //

    事件设置2012-08-2200:00:00时刻开始运行,每隔1调用一次存储过程,40天后结束,代码如下:

    CREATE EVENT test ON SCHEDULE EVERY 1DAY

    STARTS '2012-08-22 00:00:00'

    ENDS '2012-08-22 00:00:00'+INTERVAL40 DAY

    ON COMPLETION PRESERVE DO

    CALL test_add();

     

    四、   参考链接

    http://dev.mysql.com/doc/refman/5.1/en/events-configuration.html

    http://dev.mysql.com/doc/refman/5.1/en/create-event.html

    http://blog.163.com/duanpeng3@126/blog/static/8854373520105182123112/



    #################################

    Mysql定时任务(定时执行操作)
    Mysql属于中小型数据库系统,它的事件调度器Event Scheduler是在mysql 5.1才开始引入
    事件调度器是在 MySQL 5.1 中新增的另一个特色功能,可以作为定时任务调度器,
    取代部分原先只能用操作系统任务调度器才能完成的定时功能。事件调度器是定时触发执行的,
    在这个角度上也可以称作是"临时的触发器"。触发器只是针对某个表产生的事件执行一些语句,
    而事件调度器则是在某一个(间隔)时间执行一些语句。事件是由一个特定的线程来管理的,

    也就是所谓的"事件调度器"。

    代码
    /*开启event_scheduler,也可以设置为on*/
    set global event_scheduler =1;
    /*创建简单的任务,每分钟执行一次,从一个表取数据插入到另一个表,也可以定时取,可以参看下面文档,此处为简单例子*/
    CREATE EVENT MyEvent
    ON SCHEDULE EVERY 1 MINUTE 
    DO
    INSERT INTO list_test (字段1,字段1,字段1,字段1,字段1) select 字段1,字段1,字段1,字段1,字段1 from 表2 where id  = 510;
    /*每天固定时间执行*/
    CREATE EVENT EVENT_ADD_FOR20_ENOUGH
    ON SCHEDULE EVERY 1 DAY
    STARTS TIMESTAMP '2009-12-18 02:58:00'/×MYSQL注意时区设置,默认非中国时区×/
    DO
    SQL语句

    /Files/pochonlee/MySQL-Events-CN.rar

    再加两段吧

    代码
    DELIMITER $$

    DROP PROCEDURE IF EXISTS `mystock`.`TEST_KKK`$$

    CREATE PROCEDURE `mystock`.`TEST_KKK`()
        
    /*LANGUAGE SQL
        | [NOT] DETERMINISTIC
        | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
        | SQL SECURITY { DEFINER | INVOKER }
        | COMMENT 'string'
    */
        
    BEGIN
        
    DECLARE NUM INTEGER DEFAULT 0;

        
    DECLARE $A INT;

        
    SELECT (20-COUNT(STOCK_CODE)) as number into NUM FROM get_stock_list WHERE FLAG = 0 AND STIME = curdate();

        
    IF NUM>0 THEN

        
    PREPARE STMP FROM 'INSERT INTO get_stock_list (stock_code,stock_name,close,raises,stime) select stock_code,stock_name,close,result1,selectd from choice_stock  where stock_code  not in (select stock_code from get_stock_list where stime = curdate() and flag = 0) and selectd = curdate() and selectd = curdate() order by id limit ?' ;

        
    SET @A = NUM;

        
    EXECUTE STMP USING @A;

        
    END IF;
        
    END$$

    DELIMITER ;

     

     

    代码
    DELIMITER $$

    DROP FUNCTION IF EXISTS `mystock`.`FUNCTION_ADD_STOCK_FOR20`$$

    CREATE DEFINER=`root`@`localhost` FUNCTION `FUNCTION_ADD_STOCK_FOR20`() RETURNS int(11)
    BEGIN
        
    DECLARE NUM,ANOTHER INTEGER;
        
    SELECT COUNT(STOCK_CODE) as number into NUM FROM get_stock_list WHERE FLAG = 0 AND STIME = curdate();
        
    if(NUM<20)
        
    THEN 
            
    SET ANOTHER = 20 - NUM;
            
    INSERT INTO get_stock_list (stock_code,stock_name,close,raises,stime) select stock_code,stock_name,close,result1,selectd from choice_stock where stock_code  not in (select stock_code from get_stock_list where stime = curdate() and flag = 0order by id LIMIT 10;
        
    END IF;
        
    RETURN NUM;
        
    END$$

    DELIMITER ;

    *****************************************************************************************************************************

    一、基本概念
    mysql5.1版本开始引进event概念。event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发。通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程。

    二、适用范围
    对于每隔一段时间就有固定需求的操作,如创建表,删除数据等操作,可以使用event来处理。

    例如:使用event在每月的1日凌晨1点自动创建下个月需要使用的三张表。

    三、使用权限
    单独使用event调用SQL语句时,查看和创建需要用户具有event权限,调用该SQL语句时,需要用户具有执行该SQL的权限。Event权限的设置保存在mysql.user表和mysql.db表的Event_priv字段中。

    当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限,调用存储过程执行时需要使用excute权限,存储过程调用具体的SQL语句时,需要用户具有执行该SQL的权限。
    查看EVENT命令有如下几种:
     
    (1)查询mysql.event表;

    (2)通过SHOW EVENTS命令;

    (3)通过SHOW FULL EVENTS命令;

    (4)通过查询information_schema.events表

    (5)SHOW CREATE EVENT。
     
    总之,event的使用频率较低建议使用root用户进行创建和维护。

    四、基本语法

    4.1 开启定时器
    要使event起作用,MySQL的常量GLOBAL event_scheduler必须为on或者是1。
    -- 查看是否开启定时器

    复制代码 代码如下:

    SHOW VARIABLES LIKE 'event_scheduler';

    -- 开启定时器 0:off 1:on
    复制代码 代码如下:

    SET GLOBAL event_scheduler = 1;

    当你设定事件计划为0 或OFF,即关闭事件计划进程的时候,不会有新的事件执行,但现有的正在运行的事件会执行到完毕

    对于我们线上环境来说,使用event时,注意在主库上开启定时器,从库上关闭定时器,event触发所有操作均会记录binlog进行主从同步,从库上开启定时器很可能造成卡库。切换主库后之后记得将新主库上的定时器打开。
    请特别注意!

    4.2 创建事件
    CREATE EVENT 的语法如下:
    CREATE EVENT
    [IF NOT EXISTS] ---------------------------------------------*标注1
    event_name -----------------------------------------------------*标注2

    ON SCHEDULE schedule ------------------------------------*标注3
    [ON COMPLETION [NOT] PRESERVE] -----------------*标注4
    [ENABLE | DISABLE] ----------------------------------------*标注5
    [COMMENT 'comment'] --------------------------------------*标注6
    DO sql_statement -----------------------------------------------*标注7

    说明:
     
    标注1:[IF NOT EXISTS]
     
    使用IF NOT EXISTS,只有在同名event不存在时才创建,否则忽略。建议不使用以保证event创建成功。

    标注2:event_name
     
    名称最大长度可以是64个字节。名字必须是当前Dateabase中唯一的,同一个数据库不能有同名的event。

    使用event常见的工作是创建表、插入数据、删除数据、清空表、删除表。

    为了避免命名规范带来的不便,最好让事件名称具有描述整个事件的能力。建议命名规则如下为:动作名称_(INTO/FROM_)表名_TIME,例如:
    1.     每月创建(清空/删除)fans表: 
    create(truncate/drop)_table_fans_month;
    2.     每天从fans表插入(删除)数据:
    insert(delete)_into(from)_fans_day;
    标注3:ON SCHEDULE
     
    ON SCHEDULE 计划任务,有两种设定计划任务的方式:
     
    1. AT 时间戳,用来完成单次的计划任务。

    2. EVERY 时间(单位)的数量时间单位[STARTS 时间戳] [ENDS时间戳],用来完成重复的计划任务。

    在两种计划任务中,时间戳可以是任意的TIMESTAMP 和DATETIME 数据类型,时间戳需要大于当前时间。

    在重复的计划任务中,时间(单位)的数量可以是任意非空(Not Null)的整数式,时间单位是关键词:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。

    提示: 其他的时间单位也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建议使用这些不标准的时间单位。

    标注4: [ON COMPLETION [NOT] PRESERVE]
     
    ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被Drop掉,建议使用该参数,以便于查看EVENT具体信息。

    标注5:[ENABLE | DISABLE]
    参数Enable和Disable表示设定事件的状态。Enable表示系统将执行这个事件。Disable表示系统不执行该事件。

    可以用如下命令关闭或开启事件:

    ALTER EVENT event_name  ENABLE/DISABLE
    标注6:[COMMENT 'comment']
     
    注释会出现在元数据中,它存储在information_schema表的COMMENT列,最大长度为64个字节。'comment'表示将注释内容放在单引号之间,建议使用注释以表达更全面的信息。

    标注 7: DO sql_statement
     
    DO sql_statement字段表示该event需要执行的SQL语句或存储过程。这里的SQL语句可以是复合语句,例如:
    BEGIN
    CREATE TABLE test1;//创建表(需要测试一下)
    DROP TABLE test2;//删除表
    CALL proc_test1();//调用存储过程
    END

    使用BEGIN和END标识符将复合SQL语句按照执行顺序放在之间。当然SQL语句是有限制的,对它的限制跟函数Function和触发器Trigger 中对SQL语句的限制是一样的,如果你在函数Function 和触发器Trigger 中不能使用某些SQL,同样的在EVENT中也不能使用。明确的来说有下面几个:

    LOCK TABLES
    UNLOCK TABLES
    CREATE EVENT
    ALTER EVENT
    LOAD DATA

    4.3  执行逻辑
    For (已建立事件each event that has been created)
    If (事件的状态非DISABLE)
    And (当前时间在ENDS时间之前)
    And (当前时间在STARTS时间之后)
    And (在上次执行后经过的时间)
    And (没有被执行)
    Then:
    建立一个新的线程
    传递事件的SQL语句给新的线程
    (该线程在执行完毕后会自动关闭)

    4.4 修改事件
    使用ALTER EVENT 来修改事件,具体的ALTER语法如下,与创建事件的语法类似:
    ALTER EVENT
    event_name

    ON SCHEDULE schedule
    [RENAME TO new_event_name]
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE]
    [COMMENT 'comment']
    DO sql_statement

     
    4.5 删除事件
    EVENT使用DROP EVENT语句来删除已经创建的事件,语法如下:

    DROP EVENT
    [IF EXISTS]
    event_name

     
    但当一个事件正在运行中时,删除该事件不会导致事件停止,事件会执行到完毕为止。使用DROP USER和DROP DATABASE 语句同时会将包含其中的事件删除。

    五、常用实例
    每隔一秒自动调用e_test()存储过程

    复制代码 代码如下:

    CREATE EVENT IF NOT EXISTS e_test
    ON SCHEDULE EVERY 1 SECOND
    ON COMPLETION PRESERVE
    DO CALL e_test();

    每个月的一号凌晨1 点执行STAT()存储过程:
    复制代码 代码如下:

    CREATE  EVENT  NOT EXISTS  STAT
    ON  SCHEDULE  EVERY  1  MONTH  STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR)
    ON  COMPLETION  PRESERVE  ENABLE
    DO
    BEGIN
    CALL STAT();
    END
    展开全文
  • MySQL中的事件

    千次阅读 2018-07-16 09:26:54
    MySQL中的事件(event)是用于执行定时或周期性的任务,类似Linux中的crontab,但是后者只能精确到分钟,事件可以精确到秒。既然MySQL自身能实现定时性任务,那么就不必在应用层实现了。事件由一个特定的线程来管理的...

    MySQL中的事件(event)是用于执行定时或周期性的任务,类似Linux中的crontab,但是后者只能精确到分钟,事件可以精确到秒。既然MySQL自身能实现定时性任务,那么就不必在应用层实现了。事件由一个特定的线程来管理的,也就是所谓的事件调度器,但是事件不能直接调用。

    MySQL中调度器event_scheduler负责调用事件,也就是由全局变量event_scheduler的状态决定,它默认是OFF, 一般是OFF

    show variables like '%event_scheduler%';
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | event_scheduler | OFF   |
    +-----------------+-------+

    打开的方法:SET GLOBAL event_scheduler=1,关闭当然就是赋值为0了。

    查看调度器线程:

    创建事件的语法:

    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 }
    1. event_name:创建的event名字(唯一确定的)。
    2. ON SCHEDULE:计划任务。
    3. schedule: 决定event的执行时间和频率(注意时间一定要是将来的时间,过去的时间会出错),有两种形式ATEVERY
    4. [ON COMPLETION [NOT] PRESERVE]: 可选项,默认是ON COMPLETION NOT PRESERVE 即计划任务执行完毕后自动drop该事件;ON COMPLETION PRESERVE则不会drop掉。
    5. [COMMENT ‘comment’] :可选项,comment 用来描述event;相当注释,最大长度64个字节。
    6. [ENABLE | DISABLE] :设定event的状态,默认ENABLE:表示系统尝试执行这个事件。DISABLE:关闭该事情,可以用alter修改
    7. DO event_body: 需要执行的sql语句(可以是复合语句)。

    每分钟插入到表中数据:

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

    从2017年的给定时间起,每过一年调用一次存储过程ClearHis(2):

    CREATE  EVENT `e_ClearHis` ON SCHEDULE EVERY 1 YEAR STARTS '2017-03-07 02:00:00'
    ON COMPLETION PRESERVE ENABLE 
    DO call ClearHis(2);

    查看当前所在库的事件:

    show events;

    可以修改事件,不必删除再创建,例如修改第一个例子为30秒间隔:

    alter event test.event_minute
    on schedule 
    every 30 second  
    do insert into events_list values('event_now', now());

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

    alter event test.event_second disable;
    alter event test.event_second enable;

    删除事件

    DROP EVENT [IF EXISTS] event_name
    展开全文
  • mysql事件

    2016-05-17 10:56:23
    MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得一提...

    一、前言

    自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
    事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的,区别也就在这里。
    在使用这个功能之前必须确保event_scheduler已开启,可执行
    SET GLOBAL event_scheduler = 1;
     ---或我们可以在配置my.ini文件 中加上 event_scheduler = 1
    SET GLOBAL event_scheduler = ON;
    来开启,也可以直接在启动命令加上“–event_scheduler=1”,例如:
    mysqld ... --event_scheduler=1
    要查看当前是否已开启事件调度器,可执行如下SQL:
    SHOW VARIABLES LIKE 'event_scheduler';
    SELECT @@event_scheduler;
    SHOW PROCESSLIST;

    二、创建事件(CREATE EVENT)

    先来看一下它的语法:
    CREATE EVENT [IF NOT EXISTS] event_name
     ON SCHEDULE schedule
     [ON COMPLETION [NOT] PRESERVE]
     [ENABLE | DISABLE]
     [COMMENT 'comment']
     DO sql_statement;
     
    schedule:
     AT TIMESTAMP [+ INTERVAL INTERVAL]
     | EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]
     
    INTERVAL:
     quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
     WEEK | SECOND | YEAR_MONTH 
    1) 首先来看一个简单的例子来演示每秒插入一条记录到数据表
    USE test;
    CREATE TABLE aaa (timeline TIMESTAMP);
    CREATE EVENT e_test_insert
     ON SCHEDULE EVERY 1 SECOND 
     DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);
    等待3秒钟后,再执行查询看看:
    mysql> SELECT * FROM aaa;
    +---------------------+ 
    | timeline | 
    +---------------------+ 
    | 2007-07-18 20:44:26 | 
    | 2007-07-18 20:44:27 | 
    | 2007-07-18 20:44:28 | 
    +---------------------+
    2) 5天后清空test表:
    CREATE EVENT e_test
     ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
     DO TRUNCATE TABLE test.aaa;
    3) 2007年7月20日12点整清空test表:
    CREATE EVENT e_test
     ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'
     DO TRUNCATE TABLE test.aaa;
    4) 每天定时清空test表:
    CREATE EVENT e_test
     ON SCHEDULE EVERY 1 DAY
     DO TRUNCATE TABLE test.aaa;
    5) 5天后开启每天定时清空test表:
    CREATE EVENT e_test
     ON SCHEDULE EVERY 1 DAY
     STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
     DO TRUNCATE TABLE test.aaa;
    6) 每天定时清空test表,5天后停止执行:
    CREATE EVENT e_test
     ON SCHEDULE EVERY 1 DAY
     ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY
     DO TRUNCATE TABLE test.aaa;
    7) 5天后开启每天定时清空test表,一个月后停止执行:
    CREATE EVENT e_test
     ON SCHEDULE EVERY 1 DAY
     STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
     ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
     DO TRUNCATE TABLE test.aaa;
    [ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。
    8) 每天定时清空test表(只执行一次,任务完成后就终止该事件):
    CREATE EVENT e_test
     ON SCHEDULE EVERY 1 DAY
     ON COMPLETION NOT PRESERVE
     DO TRUNCATE TABLE test.aaa;
    [ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。
    [COMMENT ‘comment’]可以给该事件加上注释。

    三、修改事件(ALTER EVENT)

    ALTER EVENT event_name
     [ON SCHEDULE schedule]
     [RENAME TO new_event_name]
     [ON COMPLETION [NOT] PRESERVE]
     [COMMENT 'comment']
     [ENABLE | DISABLE]
     [DO sql_statement]
    1) 临时关闭事件
    ALTER EVENT e_test DISABLE;
    2) 开启事件
    ALTER EVENT e_test ENABLE;
    3) 将每天清空test表改为5天清空一次:
    ALTER EVENT e_test
    

    四、删除事件(DROP EVENT)

    语法很简单,如下所示:
    DROP EVENT [IF EXISTS] event_name
    例如删除前面创建的e_test事件
    DROP EVENT e_test;
    当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS
    DROP EVENT IF EXISTS e_test;
    注意:如果你将event执行了Alter event event_name disable.那么当你重新启动mysql服务
    器后,该event将被删除(测试版本:5.1.30)
    

    应用案例

    本案例是利用 event scheduler 的特性,每秒钟调用一次存储过程,用于判断 SLAVE 是否正常运行,如果发现 SLAVE 关闭了,忽略 0 次错误,然后重新启动 SLAVE。
    • 首先创建存储过程
      delimiter //
       create procedure `Slave_Monitor`()
       begin
       SELECT VARIABLE_VALUE INTO @SLAVE_STATUS
       FROM information_schema.GLOBAL_STATUS
       WHERE VARIABLE_NAME='SLAVE_RUNNING';
       IF ('ON' != @SLAVE_STATUS) THEN
       SET GLOBAL SQL_SLAVE_SKIP_COUNTER=0;
       SLAVE START;
       END IF;
       end; //
       delimiter ; 
      由于存储过程中无法调用类似 SHOW SLAVE STATUS 这样的语句,因此无法得到确切的复制错误信息和错误代码,不能进一步的处理 SLAVE 停止的各种情况。
    • 接着,创建任务
      CREATE EVENT IF NOT EXISTS `Slave_Monitor`
       ON SCHEDULE EVERY 5 SECOND
       ON COMPLETION PRESERVE
       DO
       CALL Slave_Monitor();
       
      创建了一个任务,每 5秒钟执行一次,任务结束后依旧保留该任务,而不是删除。当然了,在本例中的任务不会结束,除非将它手动禁止了。
    • 如果在运行中想要临时关闭一下某个任务,执行 ALTER EVENT 语句即可:
       (root:localhost:)test> alter event `Slave_Monitor` ON
       COMPLETION PRESERVE DISABLE;
       (root:localhost:)test> alter event `Slave_Monitor` ON
       COMPLETION PRESERVE ENABLE;
    展开全文
  • mysql 事件

    2019-06-16 06:20:20
    2019独角兽企业重金招聘Python工程师标准>>> ...
    -- CREATE TABLE `event_demo` (
    --   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    --   `name` varchar(16) NOT NULL,
    --   `seed` int(11) DEFAULT '0',
    --   `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期',
    --   PRIMARY KEY (`id`)
    -- ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
    -- 
    
    
    
    -- 【事件1】 :在某个时间点执行事件,只执行一次  
    
    DROP event IF EXISTS `event1`;
    
    CREATE EVENT `event1`
    ON SCHEDULE AT '2019-03-01 04:44:10' 
    ON COMPLETION  PRESERVE
    ENABLE
    COMMENT ' 2019-03-01 04:44:10 开始执行,执行了就结束了。这样也可以把 ON COMPLETION 设置成 NOT PRESERVE 。 就是执行结束的时候把事件也删除。当前(PRESERVE)是不会把该事件删除的'
    DO
    UPDATE event_demo SET seed = seed+1 WHERE id = 1;
    
    
    -- 【事件2】 :某个时间点加上时间单位之后执行事件(+ 表示在多久之后执行),只执行一次。  
    -- 例1: CURRENT_TIMESTAMP  + INTERVAL 1 MONTH  从现在开始,过5个月执行事件
    DROP event IF EXISTS `event2`;
    
    CREATE EVENT `event2`
    ON SCHEDULE AT '2019-03-01 05:13:10' + INTERVAL 5 SECOND  
    ON COMPLETION  PRESERVE
    ENABLE
    COMMENT '从 2019-03-01 05:13:10 开始 过5秒之后执行事件,执行完就不执行了,可以把 ON COMPLETION 设置成 NOT PRESERVE 。'
    DO
    UPDATE event_demo SET seed = seed+1 WHERE id = 2;
    
    
    
    -- 【事件3】: 周期性的执行事件, 注意将 ON COMPLETION 设置成 NOT PRESERVE 是无效的,并不会删除事件,依然会周期性的执行
    -- 例1: EVERY 1 SECOND  从现在开始,每秒执行一次
    -- 例2: EVERY 1 DAY 从现在开始,每天执行一次
    
    DROP event IF EXISTS `event3`;
    
    CREATE EVENT `event3`
    ON SCHEDULE EVERY 1 DAY 
    ON COMPLETION  PRESERVE
    ENABLE
    COMMENT '每天执行一次事件'
    DO
    UPDATE event_demo SET seed = seed+1 WHERE id = 3;
    
    
    
    
    
    -- 【事件4】 : 在某个点之后,周期性的执行事件, 注意将 ON COMPLETION 设置成 NOT PRESERVE 是无效的,并不会删除事件,依然会周期性的执行
    -- STARTS 可以是将来时间,也可以是过去时间
    -- 例1: EVERY 1 DAY STARTS '2019-03-01 04:44:10'   2019-03-01 04:44:10 之后每天执行一次
    -- 例2:  EVERY 1 HOUR STARTS '2019-03-01 04:44:10' 2019-03-01 04:44:10 之后每小时执行一次
    
    DROP event IF EXISTS `event4`;
    
    CREATE EVENT `event4`
    ON SCHEDULE EVERY 1 MINUTE STARTS '2019-03-01 05:40:00'
    ON COMPLETION  PRESERVE
    ENABLE
    COMMENT '每分钟执行一次,从 2019-03-01 05:40:00 开始'
    DO
    UPDATE event_demo SET seed = seed+1 WHERE id = 4;
    
    
    
    
    
    -- 【事件5】: 在某个时间点之后的时间,周期性的执行事件
    -- 例1:EVERY 1 SECOND STARTS '2019-03-01 04:50:10' + INTERVAL 5 SECOND  表示:  2019-03-01 04:50:10 再过5秒之后,每秒执行一次事件
    DROP event IF EXISTS `event5`;
    
    CREATE EVENT `event5`
    ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 04:50:10' + INTERVAL 5 SECOND
    ON COMPLETION  PRESERVE
    ENABLE
    DO
    UPDATE event_demo SET seed = seed+1 WHERE id = 5;
    
    
    
    
    
    -- 【事件6】: 在某个时间点之后的时间,周期性的执行事件 ,并在指定时间点上终结事件。如果要删除事件可以把 ON COMPLETION  设置成 NOT PRESERVE 。
    
    DROP event IF EXISTS `event6`;
    
    CREATE EVENT `event6`
    ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 05:51:00' + INTERVAL 5 SECOND ENDS '2019-03-01 05:52:00'
    ON COMPLETION  PRESERVE
    ENABLE
    COMMENT '从2019-03-01 05:51:05 开始触发事件,到2019-03-01 05:52:00结束事件。之后不会再执行事件了'
    DO
    UPDATE event_demo SET seed = seed+1 WHERE id = 6;
    
    
    
    
    -- 【事件7】: 在某个时间点之后的时间,周期性的执行事件 ,并在指定时间点之后一段时间终结事件。如果要删除事件可以把 ON COMPLETION  设置成 NOT PRESERVE 。
    
    DROP event IF EXISTS `event7`;
    
    CREATE EVENT `event7`
    ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 05:51:00' + INTERVAL 5 SECOND ENDS '2019-03-01 05:52:00' + INTERVAL 5 SECOND
    ON COMPLETION  PRESERVE
    ENABLE
    COMMENT '从2019-03-01 05:51:05 开始触发事件,到2019-03-01 05:52:05结束事件。之后不会再执行事件了'
    DO
    UPDATE event_demo SET seed = seed+1 WHERE id = 7;
    
    
    
    

    mysql 创建任务(事件)
      1、检查数据库事件是否开启,如果 event_scheduler 等于 NO表示开启
        SELECT @@event_scheduler; 
        SHOW VARIABLES LIKE 'event_scheduler';
        SELECT @@event_scheduler;
      2、开启任务(事件)
        a、set global event_scheduler=1; 
        b、SET GLOBAL event_scheduler = ON;
        c、在my.cnf中的[mysqld]部分添加 event_scheduler=ON 然后重启mysql。
      3、关闭事件
        SET GLOBAL event_scheduler = OFF;
      4、语法:
     

     

    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: 定义事件执行的时候检查权限的用户。
    ON SCHEDULE schedule: 定义执行的时间和时间间隔。
    ON COMPLETION [NOT] PRESERVE: 定义事件是一次执行还是永久执行,默认为一次执行,即NOT PRESERVE。
    ENABLE | DISABLE | DISABLE ON SLAVE: 定义事件创建以后是开启还是关闭,以及在从上关闭。如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE。
    COMMENT 'comment': 定义事件的注释。
    5、开启事件
    alter event event_name(事件名称) ON COMPLETION PRESERVE ENABLE; 
    6、关闭事件
    alter event event_name(事件名称) ON COMPLETION PRESERVE DISABLE; 
    7、删除事件
    DROP EVENT [IF EXISTS] event_name(事件名称)
    8、案例

     

    CREATE TABLE `test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `t1` datetime DEFAULT NULL,
      `id2` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8
    
    <!-- 创建一个每隔3秒往test表中插入一条数据的事件 -->
    CREATE EVENT IF NOT EXISTS e_test_1 ON SCHEDULE EVERY 3 SECOND
    ON COMPLETION PRESERVE
    DO INSERT INTO test(id,t1) VALUES(NULL,NOW());
    <!-- 创建一个10分钟后清空test表数据的事件  -->
    CREATE EVENT IF NOT EXISTS e_test_2
    ON SCHEDULE
    AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
    DO TRUNCATE TABLE test;
    <!-- 调用存储过程 -->
    1、创建过程
    CREATE PROCEDURE pro_test()
        BEGIN
            INSERT INTO test(id,t1,id2) VALUES(NULL,NOW(),'1000000');
        END
    2、调用过程
    CREATE EVENT IF NOT EXISTS e_test_3 ON SCHEDULE EVERY 3 SECOND
    ON COMPLETION PRESERVE
    DO CALL pro_test();

     

    9、关于事件的权限问题 (Access denied for user 'root'@'%' to database ‘xxxx’)
      使用Naicat Premium远程连接的mysql上面创建了一个新数据库和新的用户后,给该用户添加这个新数据库权限时出现:
      access denied for user 'root'@'%' to database xxxx的提示。
      错误的原因是root用户在远程连接的MYSQL上面,没有这个新数据库的授权。在本地使用mysql应该不存在这个问题。
      解决方法,执行授权:
        UPDATE mysql.user SET Event_priv = 'Y' WHERE HOST='%' AND USER='root';
        FLUSH PRIVILEGES;
        grant all PRIVILEGES on xxxx.* to root@'%' identified by 'password' with grant option;
        grant all on xxxx.* to 'root'@'%' identified by 'password' with grant option; 
        xxxx为创建的数据库,password为root的密码。请按实际要求进行更改。

     

    转载于:https://my.oschina.net/u/2552286/blog/3016431

    展开全文
  • MySQL事件(定时任务)

    千次阅读 2020-06-15 16:53:08
    MySQL 5.1中新增了一个特色功能事件调度器(Event Scheduler),简称事件。它可以作为定时任务调度器,取代部分原来只能用操作系统的计划任务才能执行的工作。另外,更值得一提的是,MySQL事件可以实现每秒钟...
  • MySQL事件(Event)详解

    千次阅读 2020-06-30 10:32:47
    1 创建事件 1.1 检查数据库事件是否开启 1.2 开启任务(事件) 1.3 关闭事件 1.4 语法 1.4.1 参数取值 1.4.2 参数定义 1.5 开启事件 1.6 关闭事件 1.7 删除事件 1.8 案例 1 创建事件 1.1 检查数据库事件...
  • Mysql 事件

    2019-05-06 23:08:04
    mysql 中的事件用于执行定时或周期性任务,事件可以精确到秒。 mysql 事件开启 set global event_scheduler = 1。 或在设置中添加 event_scheduler = on 事件状态 Enable 启动, Disable 禁用 Disable on Slave 此...
  • 1.查看事件是否开启 SHOW VARIABLES LIKE 'event_scheduler' 2.设置当前事件开启 ...我们先开启mysql事件,1,通过动态参数修改:SET GLOBAL event_scheduler = ON;注意:还是要在my.cnf中
  • Mysql自动更新数据,使用事件和函数实现
  • mysql事件没执行

    千次阅读 2017-06-12 15:51:09
    1、查看event_scheduler状态情况是ON 还是OFF  show VARIABLES like 'event%'   若为OFF,则执行下列指令 SET GLOBAL event_scheduler = 1; /*0不执行,1开始执行*/ 或 SET GLOBAL event_scheduler = ON;...
  • 创建mysql事件(每天/每时/每分)

    千次阅读 2020-09-11 16:06:16
    每天执行一次: #每天一次 DELIMITER $$ CREATE EVENT aaa ON SCHEDULE EVERY 1 DAY DO BEGIN 这里写sql,注意添加结尾分号; #如果定时任务失效,则需要配置数据库,操作:...END...
  • mysql事件失效

    千次阅读 2019-11-27 15:11:00
    1、事件是否开启,ON表示开启。 SHOW VARIABLES LIKE 'event_scheduler' 2、设置当前事件开启的两种方法。 SET GLOBAL event_scheduler = 1; SET GLOBAL event_scheduler = ON; 3、设置事件mysql启动时...
  • 现在我就来记录一下用Navicat for MySQL 来实现定时任务。 1、启动Navicat for MySQL,新建数据库连接,打开数据库,可能有点啰嗦。 2、新建一个函数 ,取名为update_qiandao ,内容为 UPDATE week7_user SET ...
  • mysql定时任务,每天凌晨1点执行

    万次阅读 2018-06-04 16:33:04
    执行mysql语句 DO后是需要执行的sqlCREATE EVENT IF NOT EXISTS temp_event ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR) ON COMPLETION PRESERVE ENABLE ....
  • mysql开启事件

    千次阅读 2018-07-04 14:54:01
    mysql开启事件set global event_scheduler = on;
  • MySQL创建事件启动事件停止事件

    千次阅读 2016-11-09 17:05:17
    mysql> alter event EVENT_RegionTrafficIndex on completion preserve enable; Query OK, 0 rows affected 2.配置定时任务event关闭: mysql> alter event EVENT_RegionTrafficIndex on completion p
  • MySQL定时任务(每天凌晨3点钟执行)
  • Mysql定时执行任务实现方法

    万次阅读 2014-11-02 22:17:28
    在开发过程中遇到过排行榜的问题,曾经想用 mysql 的 event 计划任务去做,每天让数据库定期更新数据,程序只需要拉更新后的数据即可。但是,这有几个问题: 1、如果数据量很大的话,数据库的执行时间是不确定的...
  • 昨天MySQL还能用,今天中午的时候,运行一个web应用程序需要连接数据库,本来坐等正确的程序结果,结果报错了。  一开始,打算手动通过Navicat进入数据库,结果显示 “ERROR 2003: Can't connect to MySQL server ...
  • mysql定时删除过期数据记录

    万次阅读 2017-10-16 10:17:38
    连接登录MySQL后,先查看MySQL是否开启了事件功能: 命令:show variables like '%sc%'; 发现event_sheduler是OFF关闭的; 2. 打开event_scheuler: 临时开启(mysql服务重启后之后失效)SET GLOBAL ...
1 2 3 4 5 ... 20
收藏数 131,871
精华内容 52,748
关键字:

mysql事件