MySQL數據庫DDL操做之事件調度器

MySQL中的事件調度器是在5.1版本以後新增的,能夠在數據庫中定時觸發某種操做,相似於Spring中的Quartz定時任務或者Linux中的crontab任務調度器,下面將介紹MySQL中事件調度器的用法。

一、調度器的建立:
(1)語法:mysql

CREATE EVENT event_name ON SCHEDULE <time_frequency> DO <event_statement>;

參數解釋:sql

event_name:表示自定義的事件調度器的名稱,放在CREATE EVENT關鍵字以後;
time_frequency:表示該事件調度器什麼時間執行以及執行週期爲多少;
event_statement:表示該事件調度器中要執行的具體操做或者事件,能夠爲一個語句,也能夠爲一個語句塊,即:由BEGIN...END包含的語句塊,中間能夠添加一些執行邏輯,須要使用\d指定定界符。除此以外,還能夠在event_statement中調用其餘的存儲過程和函數;

(2)示例:數據庫

示例1:建立一張測試表t_test,每隔10秒鐘向該表中插入一條記錄,操做以下:服務器

建立表結構:函數

mysql> CREATE TABLE t_test(
           id INT PRIMARY KEY AUTO_INCREMENT,
            name VARCHAR(10) NOT NULL DEFAULT '',
            create_time DATETIME
       ) ENGINE = InnoDB DEFAULT CHARSET = UTF8;

建立事件調度器:性能

mysql> CREATE EVENT insert_event 
    ON SCHEDULE EVERY 10 SECOND 
    DO 
        INSERT INTO t_test(name,create_time) VALUES('test_name',NOW());

10秒以後查詢t_test表,結果以下:學習

mysql> SELECT * FROM t_test;
Empty set (0.00 sec)

發現並無起做用,10秒以後並未插入數據,這是因爲事件調度器未打開致使,經過以下命令查看事件調度器的狀態,發現結果爲OFF,表示未打開:測試

mysql> SHOW VARIABLES LIKE 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+
1 row in set (0.01 sec)

使用以下命令打開事件調度器:操作系統

mysql> SET GLOBAL event_scheduler = ON;
或者使用:mysql> SET @@global.event_scheduler = ON;
Query OK, 0 rows affected (0.11 sec)

再次查看,已經打開事件調度器:線程

mysql> SHOW VARIABLES LIKE 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+
1 row in set (0.00 sec)

打開事件調度器的開關以後,在通過10秒,查看t_test表,發現事件調度器已經正常執行了,以下:

mysql> SELECT * FROM t_test;
+----+-----------+---------------------+
| id | name      | create_time         |
+----+-----------+---------------------+
|  1 | test_name | 2018-05-16 16:58:45 |
+----+-----------+---------------------+

注意:上述使用"SET GLOBAL"命令只能全局修改服務器參數,若是數據庫重啓,該參數會失效。若是要永久修改,須要修改MySQL的配置文件,編輯/etc/my.cnf,在[mysqld]中添加以下內容:

[mysqld]
event_scheduler = ON  #添加該項
...

示例2:上述示例是每10秒給t_test表中插入一條記錄,表中的記錄會快速增多,如今經過另一個事件調度器,完成每1分鐘清空一次t_test表中的記錄,以下:
建立事件調度器:

mysql> CREATE EVENT clear_event
ON SCHEDULE EVERY 1 MINUTE
DO
    TRUNCATE TABLE t_test;

建立完成以後,馬上查看,會發現t_test表中的數據已經被清空,再10秒後差生的數據,在1分鐘以後又會被再次清空:

mysql> SELECT * FROM t_test;
Empty set (0.00 sec)

示例3:按期清理t_log日誌表,並將清除時間及清除的記錄數量寫入t_delete_log中,經過事件調度器和存儲過程實現:
建立t_delete_log表:

CREATE TABLE t_delete_log(
    id INT PRIMARY KEY AUTO_INCREMENT,
    delete_time DATETIME,
    delete_count INT DEFAULT 0
) ENGINE = InnoDB DEFAULT CHARSET = UTF8;

建立存儲過程:

mysql> \d $
mysql> CREATE PROCEDURE p_clear()
    BEGIN
        DECLARE d_count INT DEFAULT 0;
        SET AUTOCOMMIT = 0;
        SET d_count = (SELECT COUNT(*) FROM t_log);
        # 判斷是否有待清除的數據
        IF d_count > 0 THEN
            TRUNCATE t_log;
            INSERT INTO t_delete_log(delete_time,delete_count) VALUES(NOW(),d_count);
        END IF;
        COMMIT;
    END $
mysql> \d ;

建立事件調度器:

mysql> CREATE EVENT student_clear_event
    ON SCHEDULE EVERY 1 MINUTE
    DO
        CALL p_clear();

上述事件調度器會每隔1分鐘調用一次清除表數據的存儲過程,完成一次歷史數據清理及記錄歸檔,綜合使用到了事件調度器和存儲過程。

二、調度器信息的查看:
語法:

SHOW EVENTS <LIKE statement>; #查看已有調度器的信息,能夠添加LIKE對調度器的名稱進行篩選
SHOW CREATE EVENT event_name; #查看指定名稱的調度器的建立信息
SHOW PROCESSLIST; #若是用戶具備PROCESS權限,可使用該命令查看調度器的線程狀態
SELECT <field> FROM information_schema.event; #也能夠從系統庫中查看

輸出結果中重要參數說明:

Db:表示調度器所在的數據庫
Name:表示調度器的名稱,可使用Like條件過濾查看
Definer:表示調度器的定義者
Time zone:表示調度器使用的時區,SYSTEM表示使用系統默認的時區
Interval value:表示調度器時間週期的單位,包括:YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
Starts:表示調度器的開始執時間
Status:表示調度器的可用狀態,包括:ENABLE,DISABLE,ENABLE ON SLAVE

示例1:查看在test庫中建立的事件調度器,能夠發現剛纔建立的調度器器insert_event和clear_event,以下:

mysql> USE test;
mysql> SHOW EVENTS \G
*************************** 1. row ***************************
                  Db: test
                Name: clear_event
             Definer: root@127.0.0.1
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: MINUTE
              Starts: 2018-05-16 17:08:43
                Ends: NULL
              Status: ENABLED
          Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
*************************** 2. row ***************************
                  Db: test
                Name: insert_event
             Definer: root@127.0.0.1
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: SECOND
              Starts: 2018-05-16 16:53:55
                Ends: NULL
              Status: ENABLED
          Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
2 rows in set (0.00 sec)

示例2:查看觸發器clear_event的建立信息:

mysql> USE test;
mysql> SHOW CREATE EVENT clear_event;
*************************** 1. row ***************************
               Event: clear_event
            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
           time_zone: SYSTEM
        Create Event: CREATE DEFINER=`root`@`127.0.0.1` EVENT `clear_event` ON SCHEDULE EVERY 1 MINUTE STARTS '2018-05-16 17:08:43' ON COMPLETION NOT PRESERVE ENABLE DO TRUNCATE TABLE t_test
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

示例3:查看調度器的線程狀態:

mysql> SHOW PROCESSLIST \G
*************************** 1. row ***************************
     Id: 1
   User: event_scheduler
   Host: localhost
     db: NULL
Command: Daemon
   Time: 55
  State: Waiting for next activation
   Info: NULL

三、調度器的修改:
語法:

ALTER
    [DEFINER = { user | CURRENT_USER }]
    EVENT event_name
    [ON SCHEDULE schedule]
    [ON COMPLETION [NOT] PRESERVE]
    [RENAME TO new_event_name] #修更名稱,支持RENAME語法
    [ENABLE | DISABLE | DISABLE ON SLAVE] #將其修改成可用或者不可用
    [COMMENT 'string'] #添加註釋信息
    [DO event_body]

示例:
示例1:將test庫中的insert_event事件調度器更名爲save_event,操做以下:

mysql> USE test;
mysql> ALTER EVENT insert_event RENAME TO save_event;
mysql> SHOW EVENTS  LIKE 'save_event'\G
*************************** 1. row ***************************
                  Db: test
                Name: save_event
             Definer: root@127.0.0.1
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: SECOND
              Starts: 2018-05-16 16:53:55
                Ends: NULL
              Status: ENABLED
          Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

#查看,發現已經修改。

示例2:將save_event調度器改成不可用:

mysql> USE test;
mysql> ALTER EVENT save_event DISABLE;
#查看save_event,發現Status已經變爲DISABLE,表示該調度器已經不可用了
mysql> SHOW EVENTS LIKE 'save_event'\G
*************************** 1. row ***************************
                  Db: test
                Name: save_event
             Definer: root@127.0.0.1
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: SECOND
              Starts: 2018-05-16 16:53:55
                Ends: NULL
              Status: DISABLED
          Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

#修改完成以後,再次查看save_event,已經發現沒有新數據插入了,表示修改生效。

四、調度器的禁用和刪除:
語法:

ALTER EVENT event_name DISABLE; #禁用某個調度器
DROP EVENT [IF EXISTS] event_name;  #刪除某個調度器

示例:禁用和刪除save_event事件調度器並查看:

mysql> USE test;

#若是某個調度器不用了,能夠先把其禁用
mysql> ALTER EVENT save_event DISABLE;

#肯定刪除以後,可使用DROP完成調度器刪除操做
mysql> DROP EVENT save_event;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW EVENTS LIKE 'save_event';
Empty set (0.00 sec)

五、調度器的優缺點及適用場景:
(1)優勢:
a.能夠實現相似於操做系統層面的定時任務調度;
b.能夠再數據庫層面解決事件的調度,由DBA統一維護,不依賴於操做系統層面的事件調度,有效防止了系統維護人員誤操做調度器而致使的錯誤;

(2)缺點:
a.在服務器繁忙的狀況下,或者功能對於性能要求很高的狀況下,使用調度器會對性能產生必定影響,由於調度器也是在後臺開啓線程一直在運行及判斷;
b.須要具備SUPER權限的用戶才能夠建立調度器,而SUPER用戶權限通常開發人員是不可能具備的,須要DBA專門建立;

(3)適用場景:
a.歷史數據按期統計
b.過時數據清除

至此,MySQL事件調度器的內容介紹完畢,下篇文章將詳細介紹MySQL中索引的使用,原理及注意事項,歡迎你們評論,轉發,共同窗習~

後續更多文章將更新在我的小站上,歡迎查看。

另外提供一些優秀的IT視頻資料,可免費下載!如須要請查看https://www.592xuexi.com

相關文章
相關標籤/搜索