定時器主要用於定時的執行一次或者循環執行一條sql,在實際場景上,例如,按期清理數據表,按期導出日誌文件等等場景。本次公司晚上維護系統,晚上須要按期掛維護頁,用到了定時器,這裏簡單總結一下。mysql
MySQL event 功能默認是關閉的,可使用下面的語句來看 event 的狀態,若是是 OFF 或者 0,表示是關閉的。sql
SHOW VARIABLES LIKE 'event_scheduler';
若是未開啓定時器,執行如下命令開啓定時器:服務器
SET GLOBAL event_scheduler = 1;
set global event_scheduler = on
語句開啓了事件,可是每次重啓服務器或重啓 mysql 服務後,事件會自動關閉(event_scheduler=OFF),因此想讓事件一直保持開啓,最好修改配置文件,讓 mysql 服務啓動的時候開啓時間,只須要在 my.cnf
配置文件的 [mysqld]
部分加上 event_scheduler=ON
便可: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 ;
DELIMITER $$
這個是將mysql中以 ; 結尾的規定修改成以 $$ 爲語句結束符,由於存儲過程裏能夠有多條 sql 語句,裏面的 sql 語句都以 ; 結尾,若是回車了那麼系統會當作 sql 語句直接執行了,咱們但願的是先定義這一系列 sql 語句而先不執行,因此要改下操做結束符。固然你在改後必定要改回來,你們能夠看到最後一行有對應的修改回來的語句。3d
若是須要週期性執行的語句也可用存儲過程來代替,使用 DO CALL procedure()
語句來代替。日誌
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);