事件(event)是MySQL在相應的時刻調用的過程式數據庫對象。一個事件可調用一次,也可周期性的啟動,它由一個特定的線程來管理的,也就是所謂的“事件調度器”。
事件和觸發器類似,都是在某些事情發生的時候啟動。當數據庫上啟動一條語句的時候,觸發器就啟動了,而事件是根據調度事件來啟動的。由於他們彼此相似,所以事件也稱為臨時性觸發器。
事件取代了原先只能由操作系統的計划任務來執行的工作,而且MySQL的事件調度器可以精確到每秒鍾執行一個任務,而操作系統的計划任務(如:Linux下的CRON或Windows下的任務計划)只能精確到每分鍾執行一次。
2 事件的優缺點
2.1 優點
一些對數據定時性操作不再依賴外部程序,而直接使用數據庫本身提供的功能。
可以實現每秒鍾執行一個任務,這在一些對實時性要求較高的環境下就非常實用了。
2.2 缺點
定時觸發,不可以調用。
一條create event語句創建一個事件。每個事件由兩個主要部分組成,第一部分是事件調度(event schedule),表示事件何時啟動以及按什么頻率啟動,第二部分是事件動作(event action ),這是事件啟動時執行的代碼,事件的動作包含一條SQL語句,它可能是一個簡單地insert或者update語句,也可以使一個存儲過程或者benin...end語句塊,這兩種情況允許我們執行多條SQL。
一個事件可以是活動(打開)的或停止(關閉)的,活動意味着事件調度器檢查事件動作是否必須調用,停止意味着事件的聲明存儲在目錄中,但調度器不會檢查它是否應該調用。在一個事件創建之后,它立即變為活動的,一個活動的事件可以執行一次或者多次。
循環執行事件
CREATE DEFINER=`root`@`localhost` //用戶 EVENT `test` //事件的名稱 ON SCHEDULE EVERY 60 MINUTE_SECOND //60秒循環一次 SCHEDULE EVERY '0:0:1' HOUR_SECOND SCHEDULE EVERY '0:1' HOUR_MINUTE (不同的計時方式) STARTS '2017-11-01 00:00:00.000000' ENDS '2017-11-30 00:00:00.000000' // 開始時間,結束時間 ON COMPLETION PRESERVE ENABLE //過期后禁用事件而不刪除 DO BEGIN //執行的內容 insert into events_list values('event_now', now()); insert into events_list values('event_now1', now()); END
執行多條sql語句時,用用begin...end包起來
只執行一次
CREATE DEFINER=`root`@`localhost` EVENT `test2` ON SCHEDULE AT '2017-11-17 00:00:00.000000' // 只執行一次 ON COMPLETION PRESERVE ENABLE DO insert into events_list values('event_now', now());
phpmyadmin中可以直接創建事件
show variables like '%event_scheduler%';
通過命令行
- SET GLOBAL event_scheduler = ON;
- SET @@global.event_scheduler = ON;
- SET GLOBAL event_scheduler = 1;
- SET @@global.event_scheduler = 1;
通過配置文件my.cnf
event_scheduler = 1 #或者ON
查看調度器線程
show processlist;
mysql> show processlist; +----+-----------------+-----------+------+---------+------+------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+-----------+------+---------+------+------------------------+------------------+ | 2 | root | localhost | NULL | Query | 0 | NULL | show processlist | | 3 | event_scheduler | localhost | NULL | Daemon | 6 | Waiting on empty queue | NULL | +----+-----------------+-----------+------+---------+------+------------------------+----------------
event_scheduler 線程執行中