MySQL事件調度器(Event Scheduler)介紹

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
2     ON SCHEDULE schedule
3     [ON COMPLETION [NOT] PRESERVE]
4     [ENABLE | DISABLE]
5     [COMMENT 'comment']
6     DO sql_statement;

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) 首先來看一個簡單的例子來演示每秒插入一條記錄到數據表
1 USE test;
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秒鐘後,再執行查詢看看:

1 SELECT * FROM aaa;

+———————+
| timeline            |
+———————+
| 2007-07-18 20:44:26 |
| 2007-07-18 20:44:27 |
| 2007-07-18 20:44:28 |
+———————+

2) 5天后清空test表:
1 CREATE EVENT e_test
2         ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
3         DO TRUNCATE TABLE test.aaa;
3) 2007年7月20日12點整清空test表:
1 CREATE EVENT e_test
2         ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'
3         DO TRUNCATE TABLE test.aaa;
4) 天天定時清空test表:
1 CREATE EVENT e_test
2         ON SCHEDULE EVERY 1 DAY
3         DO TRUNCATE TABLE test.aaa;
5) 5天后開啓天天定時清空test表:
1 CREATE EVENT e_test
2         ON SCHEDULE EVERY 1 DAY
3         STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
4         DO TRUNCATE TABLE test.aaa;
6) 天天定時清空test表,5天后中止執行:
1 CREATE EVENT e_test
2         ON SCHEDULE EVERY 1 DAY
3         ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY
4         DO TRUNCATE TABLE test.aaa;
7) 5天后開啓天天定時清空test表,一個月後中止執行:
1 CREATE EVENT e_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表(只執行一次,任務完成後就終止該事件):
1 CREATE EVENT e_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天清空一次:
1 ALTER EVENT e_test
2         ON SCHEDULE EVERY 5 DAY;

4、刪除事件(DROP EVENT)

語法很簡單,以下所示:

1 DROP EVENT [IF EXISTS] event_name

例如刪除前面建立的e_test事件

1 DROP EVENT e_test;

固然前提是這個事件存在,不然會產生ERROR 1513 (HY000): Unknown event錯誤,所以最好加上IF EXISTS

DROP EVENT IF EXISTS e_test;

5、後續

該特性確實很是有用,可做爲定時清空數據表、監控主從服務器、彙總數據到另外一張表等等,而且能夠精確到每秒,實時性也能夠獲得保障。除了調度SQL語句以外,MYSQL的調度器也能夠調度存儲過程。

不過若是當兩個事件的針對相同的對象的時候,會出現衝突,這種狀況還不明確是我理解的問題仍是確實是這樣,好比每秒插入和定時刪除就會衝突。

相關文章
相關標籤/搜索