數據庫中事件的理解總結

在項目中經常要使用事件來處理一些歷史數據,現在對數據庫事件進行一個總結


事件簡介

        事件(event)是MySQL在相應的時刻調用的過程式數據庫對象。一個事件可調用一次,也可週期性的啓動,它由一個特定的線程來管理的,也就是所謂的“事件調度器”。
        事件和觸發器類似,都是在某些事情發生的時候啓動。當數據庫上啓動一條語句的時候,觸發器就啓動了,而事件是根據調度事件來啓動的。由於他們彼此相似,所以事件也稱爲臨時性觸發器。
        事件取代了原先只能由操作系統的計劃任務來執行的工作,而且mysql的事件調度器可以精確到每秒鐘執行一個任務,而操作系統的計劃任務(如:Linux下的CRON或Windows下的任務計劃)只能精確到每分鐘執行一次。

事件的優缺點

         2.1 優點
              一些對數據定時性操作不再依賴外部程序,而直接使用數據庫本身提供的功能。可以實現每秒鐘執行一個任務,這在一些對實時性要求較高的環境下就非常實用了。
         2.2 缺點
              定時觸發,不可以調用。

創建事件

CREATE EVENT 的語法如下:

                                CREATE EVENT

                                                  [IF NOT EXISTS] ------------------------------------------------  *標註1
                                                  event_name------------------------------------------------------  *標註2
                                                  ON SCHEDULE schedule------------------------------------  *標註3
                                                   [ON COMPLETION [NOT] PRESERVE] ------------------  *標註4
                                                   [ENABLE | DISABLE] ------------------------------------------  *標註5
                                                   [COMMENT 'comment'] ---------------------------------------  *標註6
                                                   DO sql_statement-----------------------------------------------  *標註7


說明:

標註1:[IF NOT EXISTS]
          使用IF NOT EXISTS,只有在同名event不存在時才創建,否則忽略。建議不使用以保證event創建成功。

標註2:event_name
        名稱最大長度可以是64個字節。名字必須是當前Dateabase中唯一的,同一個數據庫不能有同名的event。使用event常見的工作是創建表、插入數據、刪除數據、清空表、刪除表。爲了避免命名規範帶來的不便,最好讓事件名稱具有描述整個事件的能力。建議命名規則如下爲:動作名稱_(INTO/FROM_)表名_TIME,例如:

                         1.     每月創建(清空/刪除)fans表:  create(truncate/drop)_table_fans_month;
                         2.     每天從fans表插入(刪除)數據: insert(delete)_into(from)_fans_day;

標註3:ON SCHEDULE

       ON SCHEDULE 計劃任務,有兩種設定計劃任務的方式:

                          1、AT 時間戳,用來完成單次的計劃任務。

                         2、 EVERY 時間(單位)的數量時間單位[STARTS 時間戳] [ENDS時間戳],用來完成重複的計劃任務。

在兩種計劃任務中,時間戳可以是任意的TIMESTAMP 和DATETIME 數據類型,時間戳需要大於當前時間。在重複的計劃任務中,時間(單位)的數量可以是任意非空(Not Null)的整數式,時間單位是關鍵詞:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。
提示: 其他的時間單位也是合法的如:QUARTER,WEEK,YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND,MINUTE_SECOND,不建議使用這些不標準的時間單位。


標註4: [ON COMPLETION [NOT] PRESERVE]

       ON COMPLETION參數表示"當這個事件不會再發生的時候",即當單次計劃任務執行完畢後或當重複性的計劃任務執行到了ENDS階段。而PRESERVE的作用是使事件在執行完畢後不會被Drop掉,建議使用該參數,以便於查看EVENT具體信息。

標註5:[ENABLE | DISABLE]

       參數Enable和Disable表示設定事件的狀態。Enable表示系統將執行這個事件。Disable表示系統不執行該事件。可以用如下命令關閉或開啓事件:
                           1、ALTER EVENT event_name  ENABLE/DISABLE

標註6:[COMMENT 'comment']

        註釋會出現在元數據中,它存儲在information_schema表的COMMENT列,最大長度爲64個字節。'comment'表示將註釋內容放在單引號之間,建議使用註釋以表達更全面的信息。


標註 7: DO sql_statement

        DO sql_statement字段表示該event需要執行的SQL語句或存儲過程。這裏的SQL語句可以是複合語句,例如:
                            BEGIN
                                  CREATE TABLE test1;//創建表(需要測試一下)
                                  DROP TABLE test2;//刪除表
                                  CALL proc_test1();//調用存儲過程
                            END
使用BEGIN和END標識符將複合SQL語句按照執行順序放在之間。當然SQL語句是有限制的,對它的限制跟函數Function和觸發器Trigger 中對SQL語句的限制是一樣的,如果你在函數Function 和觸發器Trigger 中不能使用某些SQL,同樣的在EVENT中也不能使用。明確的來說有下面幾個:LOCK TABLES、UNLOCK TABLES、CREATE EVENT、ALTER EVENT、LOAD DATA


實例:

1、馬上執行事件並調用存儲過程

                  CREATE EVENT if not exists Event_Stat_Daily

                        on schedule EVERY 1 DAY
                        on completion preserve
                        do call cp_Stat_VideoData();

2、定時執行事件並調用存儲過程

                 CREATE EVENT Event_Stat_Daily
                      ON SCHEDULE EVERY 1 DAY STARTS '2017-03-01 02:00:00'
                      ON COMPLETION PRESERVE
                      ENABLE
                      DO call cp_Stat_VideoData();


3、一些簡單的處理並沒有需要調用存儲過程,則將邏輯處理直接寫在事件中

                 DELIMITER |
                      CREATE EVENT export_access_control_data
                           ON SCHEDULE
                           EVERY 1 DAY 
                           STARTS  '2017-09-07 00:00:00'
                           ON COMPLETION PRESERVE
                           DO
                           BEGIN
                                 INSERT INTO `access_control_his` (SELECT * FROM `access_control` wWHERE DATE_SUB(CURTIME(), INTERVAL 1 DAY) >= w.`create_time`);   

                                DELETE FROM `access_control` WHERE DATE_SUB(CURTIME(), INTERVAL 1 DAY) >= `create_time`; 
                           END |
                  DELIMITER ;


其它:

         1、事件創建後但是事件並不執行,這個時候就需要檢測事件是否開啓: SHOW VARIABLES LIKE 'event_scheduler' ;  如果沒有開啓則是off  或者 DISABLED如果返回的是off表示當前是關閉狀態,如果是on當前已經開啓了計劃任務。在mysql程序的目錄下找到my.ini文件,添加一個項:event_scheduler = 1 保存後重啓mysql服務即可,重啓服務可以在服務管理裏面找到 

 

         2、也可以用腳本來實現:開啓或關閉選擇一個指令即可

                                   開啓指令:
                                             SET GLOBAL event_scheduler = ON;
                                             SET @@global.event_scheduler = ON;
                                             SET GLOBAL event_scheduler = 1;
                                             SET @@global.event_scheduler = 1;
                                   關閉指令:
                                             SET GLOBAL event_scheduler = OFF;
                                             SET @@global.event_scheduler = OFF;
                                             SET GLOBAL event_scheduler = 0;
                                             SET @@global.event_scheduler = 0;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章