zoukankan      html  css  js  c++  java
  • Mysql 作业(Scheduler)

    介绍

     作业也叫做事件调度,其实它也就是一个时间触发器;它可以定义某个时间点执行指定的数据库命令操作。

     语法

    CREATE
        [DEFINER = { user | CURRENT_USER }]    ######定义创建人,默认创建事件的用户就是事件的定义人,必须具备super权限才能指定其他用户。
        EVENT                                  ######创建事件
        [IF NOT EXISTS]                        ######删除并判断是否有存在重名的作业
        event_name                             ######作业名
        ON SCHEDULE schedule                   ######ON SCHEDULE是固定语法,schedule定义执行的时间
        [ON COMPLETION [NOT] PRESERVE]         
        [ENABLE | DISABLE | DISABLE ON SLAVE]  ######启用或者禁用或者在从库上禁用
        [COMMENT 'comment']                    ######备注
        DO                                     ######规定语法
    event_body; ######操作命令 schedule: AT
    timestamp [+ INTERVAL interval] ... ####定义执行的时间,命令在指定的时间执行一次,INTERVAL是在AT timestamp的基础上执行类似DATE_ADD()命令,在指定的时间基础上加上一个时间,其中interval参数有很多具体的时间单位具体参考下面 | EVERY interval ####EVERY是重复执行的命令和AT是冲突的 [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和EVERY是互斥的操作;AT:只在规定的时间执行一次,EVERY:重复执行。

    组合的时间格式只有“年月日时分秒”之间的组合方式,没有week的组合方式

    由于Mysql语法非常的灵活,所以它支持很多的时间格式,类似如下:

    1.在指定的时间基础上加上2分10秒
    AT '2016-06-01 22:00:00' + INTERVAL '2:10' MINUTE_SECOND
    等同于
    AT '2016-06-01 22:00:00' + INTERVAL 2 MINUTE + INTERVAL 10 SECOND
    2.在当前的时间基础上加上3星期2天 AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAY
    3.指定开始和结束时间,从当前时间加30分钟开始至当前时间加4个星期结束每12个小时执行一次命令
    EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK 

     注意:EVERY不支持“+ INTERVAL”格式,例如“+ INTERVAL 2 MINUTE + INTERVAL 10 SECOND”只能用 “ ‘2:10’ MINUTE_SECOND”代替

    查看作业功能否启用

    show  global variables like '%event_scheduler%';
    select @@event_scheduler;

    如果没有启用需要修改my.cnf,加入

    event_scheduler=1

    创建作业 

     1.在指定的时间点执行命令

    CREATE EVENT testevent 
    ON SCHEDULE AT
    '2016-06-27 22:00:00'
    COMMENT 'AT TIME '2016-06-27 22:00:00' EXEC INSERT Tevent'
    DO INSERT INTO study.Tevent() VALUES(NOW());

    2.也支持delimiter定义结束符

    delimiter |
    
    CREATE EVENT e_daily
        ON SCHEDULE
          EVERY 1 DAY
        COMMENT 'Saves total number of sessions then clears the table each day'
        DO
          BEGIN
            INSERT INTO site_activity.totals (time, total);
              SELECT CURRENT_TIMESTAMP, COUNT(*) FROM site_activity.sessions;
            DELETE FROM site_activity.sessions;
          END |
    
    delimiter ;

    3.循环

    delimiter |
    
    CREATE EVENT e
        ON SCHEDULE
          EVERY 5 SECOND
        DO
          BEGIN
            DECLARE v INTEGER;
            DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
    
            SET v = 0;
    
            WHILE v < 5 DO
              INSERT INTO t1 VALUES (0);
              UPDATE t2 SET s1 = s1 + 1;
              SET v = v + 1;
            END WHILE;
        END |
    
    delimiter ;

    4.定义开始和结束时间

    CREATE EVENT testevent ON SCHEDULE 
    EVERY 12 HOUR 
    STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE 
    ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK
    DO
    INSERT INTO study.Tevent() VALUES(NOW());

    查看数据库中创建的作业

    select * from information_schema.events;

    启用禁用作业

    1.启用
    ALTER EVENT schema.event_name ENABLE
    2.禁用
    ALTER EVENT schema.event_name DISABLE

    删除作业

    drop event schema.eventname

    官方文档:http://dev.mysql.com/doc/refman/5.6/en/create-event.html

    总结

    DO后面的支持通用的Mysql语法操作;所有可以可以执行单个命令、可以执行命令串、也可以类型函数和存储过程执行循环语句、还可以直接调用存储过程等。

    注意:每个作业都有它所属的数据库,作业是属于具体的某个数据库的。

    备注:

        作者:pursuer.chen

        博客:http://www.cnblogs.com/chenmh

    本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

    《欢迎交流讨论》

  • 相关阅读:
    【例题 8-11 UVA-10954】Add All
    【例题 8-10 UVA
    【BZOJ1226】学校食堂Dining(状压DP)
    【Tyvj1601】魔兽争霸(主席树,树套树)
    【BZOJ3504】危桥(最大流)
    【BZOJ1812】riv(多叉树转二叉树,树形DP)
    【Vijos1412】多人背包(背包DP)
    【Codevs1907】方格取数3(最小割)
    【Codevs1227】方格取数2(费用流)
    【Tyvj1982】武器分配(费用流)
  • 原文地址:https://www.cnblogs.com/chenmh/p/5614561.html
Copyright © 2011-2022 走看看