標籤:資料庫 計劃 程式
MySQL5.1.x版本中引入了一項新特性EVENT,顧名思義就是事件、定時任務機制,在指定的時間單元內執行特定的任務,因此今後一些對資料定時性操作不再依賴外部程式,而直接使用資料庫本身提供的功能。
一1、 檢查你的MYSQL是否開了這個功能
SHOW VARIABLES LIKE ‘event_scheduler‘;
或
SELECT @@event_scheduler;
若顯示:
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
則可執行
SET GLOBAL event_scheduler = 1;
或
SET GLOBAL event_scheduler = ON;
來開啟,也可以直接在啟動命令加上“–event_scheduler=1”,例如:
mysqld ... --event_scheduler=1
my.ini or my.cnf 中的[mysqld]
添加 event_scheduler=ON
二、建立事件
/*標準建立語句EventsEvents
CREATE EVENT 事件任務名稱 ON SCHEDULE AT 時戳/EVERY 任意非空的整數 時間單位 [STARTS 時戳] [ENDS時戳]
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT ‘時間任務注釋‘]
DO
BEGIN
要執行的sql語句
END
ON SCHEDULE有兩種設定計劃任務的方式:
AT 時戳:單次的計劃任務
EVERY 任意非空的整數 時間單位 [STARTS 時戳] [ENDS時戳]:重複的計劃任務
設定了[STARTS 時戳] [ENDS時戳]表示只在該時間段內重複計劃任務
時戳可以是任意的TIMESTAMP 和DATETIME 資料類型。
要求提供的是將來的時間(大於CURRENT_TIMESTAMP),而且小於Unix時間的最後時間(等於或小於‘2037-12-31 23:59:59‘)。
時間單位是關鍵詞:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。
提示: 其他的時間單位也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR, DAY_MINUTE, DAY_SECOND, HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,但他們是非標準不實用也不需要的。
[ON COMPLETION [NOT] PRESERVE]:
不寫預設是 ON COMPLETION NOT PRESERVE,表示當這個事件不會再發生的時候,即當單次計劃任務執行完畢後或當重複性的計劃任務執行到了ENDS階段,該事件任務即被drop掉。
ON COMPLETION PRESERVE 當事件任務結束後不被drop掉
提示: 基本不需要試用這個語句。
[ENABLE | DISABLE]
不寫預設是ENABLE
設定事件的狀態,如果是Enable 的話,那麼系統就會啟動這個事件,DISABLE則不啟動
可以用修改命令開啟或關閉事件,修改事件任務只要把關鍵字CREATE換成ALTER即可。
*/
樣本:
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);
2) 5天后清空test表:
CREATE EVENT e_test ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY DO TRUNCATE TABLE test.aaa;
3) 2014年12月22日12點整清空test表:
CREATE EVENT e_test ON SCHEDULE AT TIMESTAMP ‘2014-12-22 12:00:00‘ DO TRUNCATE TABLE test.aaa;
4) 每天定時清空test表:
CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY DO TRUNCATE TABLE test.aa
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 ON SCHEDULE EVERY 5 DAY;
四、刪除事件(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;
本文出自 “Linux+PHP” 部落格,請務必保留此出處http://weichyou.blog.51cto.com/6207160/1592725
MySql事件計劃任務