1、介紹
事件調度器是在 MySQL 5.1 中新增的另外一個特點功能,能夠做爲定時任務調度器,取代部分原先只能用操做系統任務調度器才能完成的定時功能。並且 MySQL 的事件調度器能夠實現每秒鐘執行一個任務,這在一些對實時性要求較高的環境下就很是實用了。mysql
事件調度器是定時觸發執行的,在這個角度上也能夠稱做是」臨時的觸發器」。觸發器只是針對某個表產生的事件執行一些語句,而事件調度器則是在某一個 (間隔)時間執行一些語句。事件是由一個特定的線程來管理的,也就是所謂的」事件調度器」。啓用事件調度器後,擁有 SUPER 權限的帳戶執行 SHOW PROCESSLIST 就能夠看到這個線程了。經過設定全局變量event_scheduler 的值便可動態的控制事件調度器是否啓用。sql
在使用這個功能以前必須確保event_scheduler已開啓,可執行服務器
1 |
SET GLOBAL event_scheduler = 1; |
或spa
1 |
SET GLOBAL event_scheduler = ON ; |
來開啓,也能夠直接在啓動命令加上「–event_scheduler=1」,例如:操作系統
1 |
mysqld ... --event_scheduler=1 |
要查看當前是否已開啓事件調度器,可執行以下SQL:線程
1 |
SHOW VARIABLES LIKE 'event_scheduler' ; |
或code
1 |
SELECT @@event_scheduler; |
2、建立事件(CREATE EVENT)
先來看一下它的語法:對象
1 |
CREATE EVENT [IF NOT EXISTS] event_name |
3 |
[ ON COMPLETION [ NOT ] PRESERVE] |
schedule:
AT TIMESTAMP [+ INTERVAL INTERVAL]
| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]事件
INTERVAL:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}it
1) 首先來看一個簡單的例子來演示每秒插入一條記錄到數據表
2 |
CREATE TABLE aaa (timeline TIMESTAMP ); |
3 |
CREATE EVENT e_test_insert |
4 |
ON SCHEDULE EVERY 1 SECOND |
5 |
DO INSERT INTO test.aaa VALUES ( CURRENT_TIMESTAMP ); |
等待3秒鐘後,再執行查詢看看:
+———————+
| timeline |
+———————+
| 2007-07-18 20:44:26 |
| 2007-07-18 20:44:27 |
| 2007-07-18 20:44:28 |
+———————+
2) 5天后清空test表:
2 |
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY |
3 |
DO TRUNCATE TABLE test.aaa; |
3) 2007年7月20日12點整清空test表:
2 |
ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00' |
3 |
DO TRUNCATE TABLE test.aaa; |
4) 天天定時清空test表:
2 |
ON SCHEDULE EVERY 1 DAY |
3 |
DO TRUNCATE TABLE test.aaa; |
5) 5天后開啓天天定時清空test表:
2 |
ON SCHEDULE EVERY 1 DAY |
3 |
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY |
4 |
DO TRUNCATE TABLE test.aaa; |
6) 天天定時清空test表,5天后中止執行:
2 |
ON SCHEDULE EVERY 1 DAY |
3 |
ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY |
4 |
DO TRUNCATE TABLE test.aaa; |
7) 5天后開啓天天定時清空test表,一個月後中止執行:
2 |
ON SCHEDULE EVERY 1 DAY |
3 |
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY |
4 |
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH |
5 |
DO TRUNCATE TABLE test.aaa; |
[ON COMPLETION [NOT] PRESERVE]能夠設置這個事件是執行一次仍是持久執行,默認爲NOT PRESERVE。
8 ) 天天定時清空test表(只執行一次,任務完成後就終止該事件):
2 |
ON SCHEDULE EVERY 1 DAY |
3 |
ON COMPLETION NOT PRESERVE |
4 |
DO TRUNCATE TABLE test.aaa; |
[ENABLE | DISABLE]但是設置該事件建立後狀態是否開啓或關閉,默認爲ENABLE。 [COMMENT 'comment']能夠給該事件加上註釋。
3、修改事件(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) 臨時關閉事件
1 |
ALTER EVENT e_test DISABLE; |
2) 開啓事件
1 |
ALTER EVENT e_test ENABLE; |
3) 將天天清空test表改成5天清空一次:
2 |
ON SCHEDULE EVERY 5 DAY ; |
4、刪除事件(DROP EVENT)
語法很簡單,以下所示:
1 |
DROP EVENT [IF EXISTS] event_name |
例如刪除前面建立的e_test事件
固然前提是這個事件存在,不然會產生ERROR 1513 (HY000): Unknown event錯誤,所以最好加上IF EXISTS
DROP EVENT IF EXISTS e_test;
5、後續
該特性確實很是有用,可做爲定時清空數據表、監控主從服務器、彙總數據到另外一張表等等,而且能夠精確到每秒,實時性也能夠獲得保障。除了調度SQL語句以外,MYSQL的調度器也能夠調度存儲過程。
不過若是當兩個事件的針對相同的對象的時候,會出現衝突,這種狀況還不明確是我理解的問題仍是確實是這樣,好比每秒插入和定時刪除就會衝突。