數據庫Event

1、基本概念
    mysql5.1版本開始引進event概念。event既「時間觸發器」。
2、適用範圍
    對於每隔一段時間就有固定需求的操做,如建立表,刪除數據等操做,能夠使用event來處理。
    例如:使用event在每個月的1日凌晨1點自動建立下個月須要使用的三張表。
3、使用權限
    單獨使用event調用SQL語句時,查看和建立須要用戶具備event權限,調用該SQL語句時,須要用戶具備執行該SQL的權限。
    Event權限的設置保存在mysql.user表和mysql.db表的Event_priv字段中。
    當event和procedure配合使用的時候,查看和建立存儲過程須要用戶具備create routine權限,
    調用存儲過程執行時須要使用excute權限,存儲過程調用具體的SQL語句時,須要用戶具備執行該SQL的權限。
----查看EVENT命令有以下幾種:
    (1)查詢mysql.event表;
    (2)經過SHOW EVENTS命令;
    (3)經過SHOW FULL EVENTS命令;
    (4)經過查詢information_schema.events表
    (5)SHOW CREATE EVENT。
    總之,event的使用頻率較低建議使用root用戶進行建立和維護。
4、基本語法
4.1 開啓定時器
    --要使event起做用,MySQL的常量GLOBAL event_scheduler必須爲on或者是1。
    -- 查看是否開啓定時器
        SHOW VARIABLES LIKE 'event_scheduler';
    -- 開啓定時器 0:off 1:on 
        SET GLOBAL event_scheduler = 1; mysql

    -- 當你設定事件計劃爲0 或OFF,即關閉事件計劃進程的時候,
    不會有新的事件執行,但現有的正在運行的事件會執行到完畢
4.2 建立事件
    -- CREATE EVENT 的語法以下:
        CREATE EVENT
        [IF NOT EXISTS] ---------------------------------------------*標註1
        event_name -----------------------------------------------------*標註2sql

        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  計劃任務,有兩種設定計劃任務的方式:
        1. AT 時間戳,用來完成單次的計劃任務。
            --時間戳能夠是任意的TIMESTAMP 和DATETIME 數據類型,時間戳須要大於當前時間。
        2. EVERY 時間(單位)的數量時間單位[STARTS 時間戳] [ENDS時間戳],用來完成重複的計劃任務。
            --時間(單位)的數量能夠是任意非空(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]
        --參數表示"當這個事件不會再發生的時候",即當單次計劃任務執行完畢後或當重複性的計劃任務執行到了ENDS階段。
            而PRESERVE的做用是使事件在執行完畢後不會被Drop掉,建議使用該參數,以便於查看EVENT具體信息。
    標註5:[ENABLE | DISABLE]
        --參數Enable和Disable表示設定事件的狀態。Enable表示系統將執行這個事件。Disable表示系統不執行該事件。
        --能夠用以下命令關閉或開啓事件:
            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數據庫

        --限制:
          在函數Function和觸發器Trigger中不能用某些SQL,在EVENT中也不能使用。明確的來講有下面幾個:
            LOCK TABLES、UNLOCK TABLES、CREATE EVENT、ALTER EVENT、LOAD DATA
4.3  執行邏輯
    For (已創建事件each event that has been created)
    If (事件的狀態非DISABLE)
    And (當前時間在ENDS時間以前)
    And (當前時間在STARTS時間以後)
    And (在上次執行後通過的時間)
    And (沒有被執行)
    Then:
    創建一個新的線程
    傳遞事件的SQL語句給新的線程
    (該線程在執行完畢後會自動關閉)函數

4.4 修改事件
    --使用ALTER EVENT 來修改事件,具體的ALTER語法以下,與建立事件的語法相似:
    ALTER EVENT  event_name
    ON SCHEDULE schedule
    [RENAME TO new_event_name]
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE]
    [COMMENT 'comment']
    DO sql_statement;
4.5 刪除事件
    --EVENT使用DROP EVENT語句來刪除已經建立的事件,語法以下:
    DROP EVENT [IF EXISTS] event_name
    --但當一個事件正在運行中時,刪除該事件不會致使事件中止,事件會執行到完畢爲止。
    --使用DROP USER和DROP DATABASE 語句同時會將包含其中的事件刪除。測試

5、經常使用實例
一、每隔一秒自動調用e_test()存儲過程
    CREATE EVENT IF NOT EXISTS e_test
    ON SCHEDULE EVERY 1 SECOND
    ON COMPLETION PRESERVE
    DO CALL e_test();線程

二、每月的一號凌晨1 點執行STAT()存儲過程:
    CREATE  EVENT IF NOT EXISTS  STAT
    ON  SCHEDULE  EVERY  1  MONTH  
    STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR)
    ON  COMPLETION  PRESERVE  ENABLE
    DO
    BEGIN
        CALL STAT();
    END
 orm

相關文章
相關標籤/搜索