原先,LAMP的程序員為了完成一些周期性的數(shù)據(jù)庫操作任務(wù),總是不得不借助于操作系統(tǒng)的幫助,比如Windows的計劃任務(wù),或者Linux的contab。MySQL5.1終于新增了Event Scheduler功能,可以直接在后臺實現(xiàn)一下定時性的作業(yè)。但不知道什么原因,在英文版的參考手冊中,位于觸發(fā)器和視圖之間的第20章Event Scheduler,在中文版中被刪減掉了,手冊的其他部分也沒有絲毫提到它,好像它根本就不存在一樣,所以它的知名度不是很高。有興趣的讀者可以參考 http://dev./doc/refman/5.1/en/events.html獲得比較完整的幫助。
1.1 開啟 MySQL的Event Scheduler是根據(jù)預(yù)先安排的計劃進(jìn)行數(shù)據(jù)庫操作的數(shù)據(jù)庫對象,可以看作是一種“時間觸發(fā)器”。Event實際上是被一個特殊的event scheduler線程執(zhí)行的,假如它正在運行的話,可以通過SHOW PROCESSLIST命令看到它。全局變量event_scheduler用來設(shè)定是否服務(wù)器端運行執(zhí)行計劃任務(wù),該變量有如下三種值: OFF:計劃任務(wù)處于停止?fàn)顟B(tài),event scheduler線程沒有運行。是event_scheduler的默認(rèn)值; ON:計劃任務(wù)處于運行狀態(tài),event scheduler線程啟動,并執(zhí)行所有的計劃任務(wù); DISABLED:該值將致使計劃任務(wù)不可運行 你可以使用下列的任意一句開啟計劃任務(wù): SET GLOBAL event_scheduler = ON; SET @@global.event_scheduler = ON; SET GLOBAL event_scheduler = 1; SET @@global.event_scheduler = 1;
1.2 創(chuàng)建 Event Scheduler作為一種數(shù)據(jù)庫對象,其增刪改的DDL語句與其他對象非常相似,無非CREATE、ALTER、DROP等,創(chuàng)建的基本語法是: 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) 創(chuàng)建Event嘛,這倆關(guān)鍵字當(dāng)然不能少了 (2) 如果不存在同名的數(shù)據(jù)庫對象才創(chuàng)建 (3) 計劃任務(wù)的名字。作為數(shù)據(jù)庫對象,都有一個本庫內(nèi)唯一的名字做標(biāo)識 (4) 計劃任務(wù)的計劃,重點就在這兒。有兩個關(guān)鍵字來設(shè)定任務(wù)的執(zhí)行計劃:AT和EVERY: AT指定的是一個一次性計劃,后面跟著一個時間戳,后續(xù)的sql語句將在指定的時間被執(zhí)行一次; EVERY指定的是一個周期性計劃,在該子句中可以指定從某時間點到某時間點期間,每隔某周期就執(zhí)行一次該任務(wù)。 (5) 任務(wù)整個執(zhí)行完畢后,該計劃任務(wù)對象是否還在數(shù)據(jù)庫中保留。默認(rèn)不保留 (6) 有效或失效。默認(rèn)有效 (7) 真正要執(zhí)行的語句
1.3 實例 首先是一個一次性計劃任務(wù)的例子,該任務(wù)在指定的2008-02-06 23:59:00這個時間點,向messages表中插入一條記錄: CREATE EVENT e_totals ON SCHEDULE AT '2006-02-10 23:59:00' DO INSERT INTO messages VALUES (null, 'admin', '過年了!', '祝大家鼠年發(fā)大財?。?!', '127.0.0.1',NOW()); 下面是一個周期性計劃任務(wù)的例子,該任務(wù)在2008-02-06 23:59:00開始的一年內(nèi),每隔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;
計劃任務(wù)屬于數(shù)據(jù)庫服務(wù)器端的對象,創(chuàng)建好后,只要開啟了event_scheduler,就可以自動觸發(fā)執(zhí)行了,不用在前臺進(jìn)行任何干預(yù)。當(dāng)然一定要記住,只有MySQL5.1以上版本才支持該對象。
|