(14)mysql 中的事件

林灣村龍貓發表於2019-02-27

概述

事件排程器是MySQL5.1後新增的功能,可以將資料庫按自定義的時間週期觸發某種操作,可以理解為時間觸發器,類似於linux系統下面的任務排程器crontab,或者類似與window下面的計劃任務。值得一提的是MySQL的事件排程器可以精確到每秒鐘執行一個任務,而作業系統的計劃任務(如:Linux下的CRON或Windows下的任務計劃)只能精確到每分鐘執行一次。

檢視事件功能是否開啟

在使用事件這個功能,首先要保證你的mysql的版本是5.1以上,然後還要檢視你的mysql伺服器上的事件是否開啟。
檢視事件是否開啟,使用如下命令檢視:

#方式一
SHOW VARIABLES LIKE `event_scheduler`;
#方式二
SELECT @@event_scheduler;
#方式三
SHOW PROCESSLIST;

#檢視事件狀態
SHOW EVENTS;複製程式碼

如果看到event_scheduler為on或者PROCESSLIST中顯示有event_scheduler的資訊說明就已經開啟了事件。如果顯示為off或者在PROCESSLIST中檢視不到event_scheduler的資訊,那麼就說明事件沒有開啟,我們需要開啟它。

開啟事件功能

方式一、通過動態引數修改

SET GLOBAL event_scheduler = ON;複製程式碼

更改完這個引數就立刻生效了,但是重啟mysql又還原了,即設定不能跨重啟。
方式二、更改配置檔案然後重啟
在my.cnf中的[mysqld]部分新增如下內容,然後重啟mysql。

event_scheduler=ON;複製程式碼

一勞永逸,需要能夠修改資料庫配置的許可權。

方式三、直接在啟動命令加上“–event_scheduler=1”

mysqld ... --event_scheduler=ON複製程式碼

事件的語法

1. 建立事件

CREATE
    [DEFINER = { user | CURRENT_USER }]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT `comment`]
    DO event_body;

schedule:
    AT timestamp [+ INTERVAL interval] ...
     | EVERY interval
    [STARTS timestamp [+ INTERVAL interval] ...]
    [ENDS timestamp [+ INTERVAL interval] ...]
interval:
  quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR |
DAY_MINUTE |DAY_SECOND | HOUR_MINUTE |
HOUR_SECOND | MINUTE_SECOND}複製程式碼

DEFINER: 定義事件執行的時候檢查許可權的使用者。
ON SCHEDULE schedule: 定義執行的時間和時間間隔。
ON COMPLETION [NOT] PRESERVE: 定義事件是一次執行還是永久執行,預設為一次執行,即NOT PRESERVE。
ENABLE | DISABLE | DISABLE ON SLAVE: 定義事件建立以後是開啟還是關閉,以及在從上關閉。如果是從伺服器自動同步主上的建立事件的語句的話,會自動加上DISABLE ON SLAVE。
COMMENT `comment`: 定義事件的註釋。

###2. 更改事件

ALTER
    [DEFINER = { user | CURRENT_USER }]
    EVENT event_name
    [ON SCHEDULE schedule]
    [ON COMPLETION [NOT] PRESERVE]
    [RENAME TO new_event_name]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT `comment`]
    [DO event_body]複製程式碼

3. 刪除事件的語法

DROP EVENT [IF EXISTS] event_name;複製程式碼

##事件使用舉例

###1. 建立事件

舉例一
定時每隔3秒向表test2中插入資料

create event event_insert_t2
on schedule every 3 second
on completion preserve
do insert into test2(department,time_v) value(`1`,now());複製程式碼

執行結果

(14)mysql 中的事件
事件執行結果

舉例二
建立一個10分鐘後清空test表資料的事件

CREATE EVENT IF NOT EXISTS event_truncate_test2
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
DO TRUNCATE TABLE test2;複製程式碼

舉例三
建立一個在2015-04-17 14:42:00時刻清空test表資料的事件

DROP EVENT IF EXISTS event_truncate_test2;
CREATE EVENT event_truncate_test2
ON SCHEDULE
AT TIMESTAMP `2015-04-17 14:42:00`
DO TRUNCATE TABLE test2;複製程式碼

舉例四
5天后開啟每天定時3秒向表test2中插入資料,一個月後停止執行

CREATE EVENT IF NOT EXISTS event_truncate_test2
ON SCHEDULE EVERY 3 SECOND
STARTS CURRENT_TIMESTAMP + INTERVAL 5 day
ENDS CURRENT_TIMESTAMP + INTERVAL  1 month
ON COMPLETION PRESERVE
DO INSERT INTO test2(department,time_v) VALUES(`1`,NOW());複製程式碼

修改事件舉例

舉例一
臨時關閉事件

alter event event_insert_t2 disable;複製程式碼

其他類似建立事件。

刪除事件舉例

DROP EVENT IF EXISTS event_insert_t2;複製程式碼

事件呼叫儲存過程或函式如同普通呼叫。

事件的優缺點及應用場景

  1. 優點
  • 定時任務由dba統一管理,避免部署在作業系統層。
  • 減少系統管理員產生誤操作的風險。
  • 有利於後續的管理和維護。
  1. 缺點
  • 在繁忙且要求效能的資料庫上慎重部署和啟用排程器。
  • 過於複雜的處理更適合使用程式實現。
  • 開啟和關閉事件需要具有超級使用者許可權。
  1. 應用場景
    適用於定期收集統計資訊,定期清除歷史資料,定期資料庫檢查等等。

參考

blog.163.com/duanpeng3@1…
blog.chinaunix.net/uid-2063977…

相關文章