mysql-經常使用組件之定時器

定時器主要用於定時的執行一次或者循環執行一條sql,在實際場景上,例如,按期清理數據表,按期導出日誌文件等等場景。本次公司晚上維護系統,晚上須要按期掛維護頁,用到了定時器,這裏簡單總結一下。mysql

啓用定時器

MySQL event 功能默認是關閉的,可使用下面的語句來看 event 的狀態,若是是 OFF 或者 0,表示是關閉的。sql

  • 檢查命令
SHOW VARIABLES LIKE 'event_scheduler';
  • 定時器已經開啓的執行結果:

開啓成功示例.png
若是未開啓定時器,執行如下命令開啓定時器:服務器

SET GLOBAL event_scheduler = 1;
  • 注意:雖然這裏用 set global event_scheduler = on 語句開啓了事件,可是每次重啓服務器或重啓 mysql 服務後,事件會自動關閉(event_scheduler=OFF),因此想讓事件一直保持開啓,最好修改配置文件,讓 mysql 服務啓動的時候開啓時間,只須要在 my.cnf 配置文件的 [mysqld] 部分加上 event_scheduler=ON 便可:
    設置定時器自啓動.png
  • 關閉定時器命令:
SET GLOBAL event_scheduler = 0;

建立定時器

建立定時器 SQL 模板:ui

DELIMITER $$

-- SET GLOBAL event_scheduler = ON$$     -- required for event to execute but not create    

CREATE  /*[DEFINER = { user | CURRENT_USER }]*/ EVENT `dbName`.`eventName` -- 事件名

ON SCHEDULE
     /* uncomment the example below you want to use */

    -- scheduleexample 1: run once 只執行一次

       --  AT 'YYYY-MM-DD HH:MM.SS'/CURRENT_TIMESTAMP { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] }

    -- scheduleexample 2: run at intervals forever after creation 建立完後周期性執行

       -- EVERY 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...]

    -- scheduleexample 3: specified start time, end time and interval for execution 指定開始和結束時間,並在期間內週期性的執行
       /*EVERY 1  [HOUR|MONTH|WEEK|DAY|MINUTE|...]

       STARTS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1[HOUR|MONTH|WEEK|DAY|MINUTE|...] }

       ENDS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] } */

/*[ON COMPLETION [NOT] PRESERVE] -- 時間完成後是否刪除事件
[ENABLE | DISABLE] -- 是否當即生效
[COMMENT 'comment']*/

DO
    BEGIN
        (sql_statements) -- 須要週期性執行的 sql 語句
    END$$

DELIMITER ;
  • 注意
  1. DELIMITER $$ 這個是將mysql中以 ; 結尾的規定修改成以 $$ 爲語句結束符,由於存儲過程裏能夠有多條 sql 語句,裏面的 sql 語句都以 ; 結尾,若是回車了那麼系統會當作 sql 語句直接執行了,咱們但願的是先定義這一系列 sql 語句而先不執行,因此要改下操做結束符。固然你在改後必定要改回來,你們能夠看到最後一行有對應的修改回來的語句。3d

  2. 若是須要週期性執行的語句也可用存儲過程來代替,使用 DO CALL procedure() 語句來代替。日誌

  3. 設置定時器事件的生效與否語句:
ALTER EVENT event_minute DISABLE;  # 關閉事件
ALTER EVENT event_minute ENABLE;   # 啓用事件

舉例

1.從如今開始每隔九天定時執行code

ON SCHEDULE EVERY 9 DAY STARTS NOW() ;

2.每月的一號凌晨 1 點執行blog

on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);

3.每一個季度一號的凌晨1點執行事件

on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);
相關文章
相關標籤/搜索