原先,LAMP的程序員為了完成一些周期性的數據庫操作任務,總是不得不借助於操作系統的幫助,比如Windows的計劃任務,或者Linux的contab。MySQL5.1終於新增了Event Scheduler功能,可以直接在後台實現一下定時性的作業。但不知道什麼原因,在英文版的參考手冊中,位於觸發器和視圖之間的第20章Event Scheduler,在中文版中被刪減掉了,手冊的其他部分也沒有絲毫提到它,好像它根本就不存在一樣,所以它的知名度不是很高。有興趣的讀者可以參考http://dev.mysql.com/doc/refman/5.1/en/events.html獲得比較完整的幫助。
一、開啟
MySQL的Event Scheduler是根據預先安排的計劃進行數據庫操作的數據庫對象,可以看作是一種“時間觸發器”。Event實際上是被一個特殊的event scheduler線程執行的,假如它正在運行的話,可以通過SHOW PROCESSLIST命令看到它。全局變量event_scheduler用來設定是否服務器端運行執行計劃任務,該變量有如下三種值:
OFF:計劃任務處於停止狀態,event scheduler線程沒有運行。是event_scheduler的默認值;
ON:計劃任務處於運行狀態,event scheduler線程啟動,並執行所有的計劃任務;
DISABLED:該值將致使計劃任務不可運行
SET GLOBAL event_scheduler = ON; SET @@global.event_scheduler = ON; SET GLOBAL event_scheduler = 1; SET @@global.event_scheduler = 1;創建Event Scheduler作為一種數據庫對象,其增刪改的DDL語句與其他對象非常相似,無非CREATE、ALTER、DROP等,創建的基本語法是:
CREATE EVENT (1) [IF NOT EXISTS] (2) event_name (3) ON SCHEDULE schedule (4) [ON COMPLETION [NOT] PRESERVE] (5) [ENABLE | DISABLE] (6) [COMMENT 'comment'] (7) DO sql_statement (8)(1) 創建Event嘛,這倆關鍵字當然不能少了;
CREATE EVENT e_totals ON SCHEDULE AT '2006-02-10 23:59:00' DO INSERT INTO messages VALUES (null, 'admin', '過年了!', '祝大家鼠年發大財!!!', '127.0.0.1',NOW());下面是一個周期性計劃任務的例子,該任務在2008-02-06 23:59:00開始的一年內,每隔1小時就刪除掉messages表的早先的10條記錄:
CREATE EVENT e_hourly ON SCHEDULE EVERY 1 HOUR STARTS '2007-02-10 23:59:00' ENDS '2008-02-10 23:59:00' DO DELETE FROM messages limit 10;
計劃任務屬於數據庫服務器端的對象,創建好後,只要開啟了event_scheduler,就可以自動觸發執行了,不用在前台進行任何干預。當然一定要記住,只有MySQL5.1以上版本才支持該對象。