1. 程式人生 > >MySQL之event的介紹

MySQL之event的介紹

而是 調用 變更 second 元數據 海量 激活 def 機制

MySQL5.1.6版本中引入了一項新特性EVENT,顧名思義就是事件、定時任務機制,在指定的時間單元內執行特定的任務,因此今後一些對數據定時性操作不再依賴外部程序,而直接使用數據庫本身提供的功能。
其實MySQL的EVENT 功能和linux下的的at、crontab或Windows下的Task Scheduler計劃任務類似。 也被稱為MySQL事件調度器(Event Scheduler),可以在某一個時間點執行一個SQL語句或一個語句塊(BEGIN ... END);或者每隔固定間隔重復執行

一. 開啟MySQL event_scheduler

要查看當前是否已開啟事件調度器,可執行如下SQL:

SHOW VARIABLES LIKE ‘event_scheduler‘;

SELECT @@event_scheduler;

SHOW PROCESSLIST;
若顯示:

+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
則可執行
SET GLOBAL event_scheduler = 1;

SET GLOBAL event_scheduler = ON;
來開啟,也可以直接在啟動命令加上“–event_scheduler=1”,例如:

mysqld ... --event_scheduler=1

my.ini or my.cnf 中的
[mysqld]
添加 event_scheduler=ON

二.event的信息查詢和含義

查看創建event語句:

mysql> show create event e_test\G
*************************** 1. row ***************************
               Event: e_test
            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
           time_zone: SYSTEM
        Create Event: CREATE DEFINER=`root`@`localhost` EVENT `e_test` ON SCHEDULE EVERY 60 SECOND STARTS ‘2018-09-07 18:21:00‘ ON COMPLETION PRESERVE DISABLE DO BEGIN
CALL p_test2();
END
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

查看某個event的狀態信息,可查看mysql.event或者information_schema.events,或者簡單地切到當前DB後執行show events; 三者的內容基本一致,information_schema無法做了下數據復制,更改了下列名稱和starts時間以便更好的閱讀。這裏已information_schema.events裏的信息為例解釋

mysql> select *  from information_schema.events limit 1\G
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: test
          EVENT_NAME: e_test
             DEFINER: root@localhost
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: BEGIN
CALL p_test2();
END
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 60
      INTERVAL_FIELD: SECOND
            SQL_MODE: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
              STARTS: 2018-09-07 18:21:00
                ENDS: NULL
              STATUS: DISABLED
       ON_COMPLETION: PRESERVE
             CREATED: 2018-09-07 18:26:07
        LAST_ALTERED: 2018-09-12 17:13:37
       LAST_EXECUTED: 2018-09-12 17:13:00
       EVENT_COMMENT: 
          ORIGINATOR: 1131053306
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
  DATABASE_COLLATION: utf8_general_ci
1 row in set (0.01 sec)

相關參數介紹:

EVENT_CATALOG:一般都是def,不管
EVENT_SCHEMA:event所在的schema
EVENT_NAME:event的名稱
DEFINER:event的定義者,和定義這個event時,默認selectcurrent_user()的結果一致,如果該user有super權限,可以指定為其他用戶
TIME_ZONE:event使用的時區,默認是system,建議別做修改
EVENT_BODY:一般都是SQL,不用管
EVENT_DEFINITION:該event的內容,可以是具體的insert等SQL,也可以是一個調用存儲過程的操作
EVENT_TYPE:這個參數比較重要,定義的時候指定,有兩個值:RECURRING和ONE TIME,RECURRING表示只要符合條件就會重復執行,而ONE TIME只會調用一次
EXECUTE_AT: 針對one-time類型的event有效,如果是RECURRING類型的event一般為NULL,表示該event的預計執行時間
INTERVAL_VALUE:針對RECURRING類型的event有效,表示執行間隔長度
INTERVAL_FIELD:針對RECURRING類型的event有效,表示執行間隔的單位,一般是SECOND,DAY等值,可參考創建語法
SQL_MODE:當前event采用的SQL_MODE
STARTS:針對RECURRING類型的event有效,表示一個event從哪個時間點點開始執行,和one-time的EXECUTE_AT功能類似。為NULL表示一符合條件就開始執行
ENDS:針對RECURRING類型的event有效,表示一個event到了哪個時間點後不再執行,如果為NULL就是永不停止
STATUS:一般有三個值,ENABLED, DISABLED和 SLAVESIDE_DISABLED,其中ENABLED表示激活這個event,該event只要符合其他條件就會執行;DISABLED狀態改event將不會執行,SLAVESIDE_DISABLED表示在從庫上不執行該event。需要特別註意在從庫上不要執行任何形式的event,因為如果主庫執行一次,復制到從庫後,從庫再執行一次的話,那就數據不一致了,一般來說直接禁用掉從庫上的總開關event_scheduler就行。
ON_COMPLETION:只有兩種值,PRESERVE和NOT PRESERVE,PRESERVE
CREATED:event的創建時間
LAST_ALTERED:event最新一次被修改的時間
LAST_EXECUTED:event最近一次執行的時間,如果為NULL表示從未執行過
EVENT_COMMENT:event的註釋信息
ORIGINATOR:當前event創建時的server-id,用於主從上的處理,比如SLAVESIDE_DISABLED
CHARACTER_SET_CLIENT:event創建時的客戶端字符集,即character_set_client
COLLATION_CONNECTION:event創建時的連接字符校驗規則,即collation_connection
DATABASE_COLLATION:event創建時的數據庫字符集校驗規則

三.使用建議

重要的事情 說3遍:註意!註意!註意!

  1. 如果是設定事件計劃為0 或OFF,即關閉事件計劃進程的時候,不會有新的事件執行,但現有的正在運行的事件會執行到完畢。
  2. 對於線上環境來說,使用event時,註意在主庫上開啟定時器,從庫上上務必要關閉定時器,event觸發所有操作均會記錄binlog進行主從同步,從庫上開啟定時器很可能造成卡庫。切換主庫後之後記得將新主庫上的定時器打開。
    3.創建,刪除等操作嚴禁直接操作mysql.event表,而是通過create等正規語法實現,不然會導致元數據混亂,各種莫名其妙的問題隨之產生,比如event不執行或者重復執行。這時一般只有重啟DB才能解決 了。

4.創建的event涉及到海量數據變更的話,要做好充分測試,確保不影響現網服務

5.如果需要備份帶有event的DB,mysqldump時需要加上--event參數

6.參數event_scheduler為事件調度器的總開關,一般來說設置為ON或者OFF就好,不建議設置成disabled,如果設置為ON,show processlist可看到該線程

mysql> show processlist;
+--------+-----------------+-----------+------+---------+------+------------------------+------------------+
| Id     | User            | Host      | db   | Command | Time | State                  | Info             |
+--------+-----------------+-----------+------+---------+------+------------------------+------------------+
|      1 | event_scheduler | localhost | NULL | Daemon  | 1439 | Waiting on empty queue | NULL             |
| 693553 | root            | localhost | test | Query   |    0 | init                   | show processlist |
+--------+-----------------+-----------+------+---------+------+------------------------+------------------+
2 rows in set (0.03 sec)

MySQL之event的介紹