MySQL入門--EVENT(事件)

panpong發表於2019-06-03

MySQL   EVENT (事件)

MySQL 事件是按排程表執行的任務。這些事件可稱為“排程事件”。建立事件時,會將其建立為命名資料庫物件,其中包含在特定時間執行或定期重複發生的 SQL 語句(或儲存過程)。這在概念上與 Linux/UNIX crontab (也稱為“ cron 作業”)或 Windows 任務排程程式的理念類似。語法與相關語句如下:

CREATE EVENT event_name ON SCHEDULE schedule DO sql_statement

事件語句:

SET GLOBAL event_scheduler = {ON | OFF}

CREATE EVENT

ALTER EVENT

DROP EVENT

event_name :事件是模式物件,與表、儲存過程和觸發器一樣。 event_name 必須是有效的識別符號,且可以按正常方式透過模式名稱進行引用和 / 或限定。事件名稱在模式中必須是唯一的。

schedule :排程表是一種規則,用於指定 MySQL 執行與事件相關聯的操作的時間。

sql_statement :您必須包含按排程表執行的有效 SQL 語句或儲存過程語句。此語句受到的限制與適用於儲存函式和動態 SQL 的限制相同。例如,該語句無法返回結果集(如 SELECT SHOW 所生成的結果集)。通常會使用 CALL 語句呼叫過程來執行實際操作。

 

1.1.        排程表

排程表是指定應在何時執行操作的規則。可以在 CREATE EVENT ALTER EVENT 語句的 SCHEDULE 子句中指定排程表。

有兩種型別的排程表:執行一次的排程表(使用 AT 關鍵字)和可重複執行的排程表(使用 EVERY 關鍵字)。對於後者,必須定義事件的重複頻率。還可以定義一個時間段,以確定應重複執行事件的期限。

SCHEDULE 子句的語法如下所示:

AT timestamp [+ INTERVAL interval]| EVERY interval [STARTS timestamp [+ INTERVAL interval]] [ENDS timestamp [+ INTERVAL interval]]

SCHEDULE 子句可包含以下變數元素:

Ø   timestamp DATETIME TIMESTAMP 型別的表示式;

Ø   interval :用於指定持續時間。持續時間的表示方法為,指定一個整數數量,後跟用於定義特定種類持續時間的關鍵字。有效的關鍵字包括:

- YEAR

- QUARTER

- MONTH

- DAY

- HOUR

- MINUTE

- WEEK

- SECOND

- YEAR_MONTH

- DAY_HOUR

- DAY_MINUTE

- DAY_SECOND

- HOUR_MINUTE

- HOUR_SECOND

- MINUTE_SECOND

 

事件排程程式是 mysqld 程式中的一個單獨執行緒,負責執行排程事件。排程程式會檢查是否應執行事件;如果應執行事件,則會建立新的連線來執行操作。

使用事件來自動地定期執行(維護)任務,如更新彙總表或重新整理查詢中的表(物化檢視 模擬),或者執行夜間作業。例如,處理白天的工作、載入資料倉儲或者將資料匯出到 檔案中。

 

1.2.        事件排程程式和許可權

1)        事件排程程式

建立事件後,該事件將儲存在資料庫中,以便按排程表執行。 event_scheduler 執行緒會監控所有事件的排程表,在到達排程表中的時間時,該執行緒會啟動一個新的執行緒來執行每個事件。

預設情況下, event_scheduler 執行緒設定為 OFF 。您必須顯式啟用該執行緒,方法為修改全域性 event_scheduler 伺服器變數的值,將其設定為 ON 。還可以透過將伺服器變數新增到選項檔案中(以便更改在啟動時生效)或動態使用 SET 語法來實現。如果在 event_scheduler 設定為 DISABLED 的情況下啟動伺服器,則無法在 MySQL 正在執行時透過 SET 語句將其啟用。而必須停止 MySQL 並在啟用該選項的情況下重新啟動 MySQL

啟用 event_scheduler 執行緒後,您可以在 SHOW PROCESSLIST 的輸出(以及 INFORMATION_SCHEMA 等效項 PROCESSLIST )中看到該執行緒。

可以使用 ALTER EVENT 語法更改 EVENT 。可以透過該語法更改 EVENT 的每個元素。因此, ALTER EVENT 的語法模型幾乎與 CREATE EVENT 語句的語法模型完全相同。

 

2)        事件排程許可權

必須擁有 SUPER 許可權才能設定全域性 event_scheduler 變數。必須擁有 EVENT 許可權才能建立、修改或刪除事件。

Ø   使用 GRANT 分配許可權(僅限在模式級別)

mysql> GRANT EVENT ON myschema.* TO user1@srv1;

mysql> GRANT EVENT ON *.* TO user1@srv1;

Ø   使用 REVOKE 取消事件許可權

REVOKE EVENT ON myschema.* FROM user1@srv1;

要取消 EVENT 許可權,請使用 REVOKE 語句。撤消使用者帳戶的 EVENT 許可權不會刪除或禁用該帳戶已建立的任何事件。

使用者的 EVENT 許可權儲存在 mysql.user mysql.db 表的 Event_priv 列中。在這兩種情況下,該列均儲存值“ Y ”或“ N ”之一。“ N ”是預設值。僅當給定使用者擁有全域性 EVENT 許可權時,該使用者的 mysql.user.Event_priv 值才會設為“ Y ”。對於模式級別的 EVENT 許可權, GRANT 會在 mysql.db 中建立一個行,並按如下所示設定該行的列值:

l   Db :模式的名稱

l   User :使用者的名稱

l   Event_priv :“ Y

您不必直接操作這些表,因為 GRANT EVENT REVOKE EVENT 語句會對其執行所需的操作。

1.3.        事件執行許可權

事件使用事件定義者的許可權進行執行。如果定義者無權執行某任務,則事件無法執行該任務。示例如下:

user1@srv1 只能為 myschema 建立 SELECT 事件:

CREATE EVENT e_store_ts ON SCHEDULE EVERY 10 SECOND

DO

INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP());

由於缺少 INSERT 許可權,該事件不會在表中建立任何行。事件使用其定義者的許可權進行執行,並且無法執行定義者無權執行的任何操作,瞭解這一點非常重要。例如,假設 user1@srv1 擁有對 myschema EVENT 許可權。再假設該使用者擁有對 myschema SELECT 許可權,但是沒有針對此模式的其他許可權。儘管 user1@srv1 可以建立新事件,但該事件本身無法執行 INSERT 操作,因為定義者 user1@srv1 無權執行該操作。

 

錯誤日誌

如果檢視 MySQL 錯誤日誌 (hostname.err) 可以看到事件正在執行,但是該事件嘗試執行的操作失敗(由 RetCode=0 指明):

...

060209 22:39:44 [Note] EVEX EXECUTING event newdb.e [EXPR:10]

060209 22:39:44 [Note] EVEX EXECUTED event newdb.e [EXPR:10]. RetCode=0

060209 22:39:54 [Note] EVEX EXECUTING event newdb.e [EXPR:10]

060209 22:39:54 [Note] EVEX EXECUTED event newdb.e [EXPR:10]. RetCode=0

060209 22:40:04 [Note] EVEX EXECUTING event newdb.e [EXPR:10]

060209 22:40:04 [Note] EVEX EXECUTED event newdb.e [EXPR:10]. RetCode=0

...

1.4.        檢查事件

SHOW CREATE EVENT event_name 此語句顯示重新建立給定事件所需的 CREATE EVENT 語句。必須提供事件名稱才能檢視該事件的相關資訊。

SHOW EVENTS 此語句為 MySQL 擴充套件。它可返回事件的特徵,如資料庫、名稱、型別、建立者以及建立和修改日期。此語句有一個優點:可基於 LIKE 模式或 WHERE 子句中提供的條件來顯示特定事件。如果未提供此類條件,則 SHOW EVENTS 語句會顯示所有事件的相關資訊。

INFORMATION_SCHEMA.EVENTS

EVENT_CATALOG: NULL

EVENT_SCHEMA: myschema

EVENT_NAME: e_store_ts

DEFINER: user1@srv1

EVENT_BODY: SQL

EVENT_DEFINITION: INSERT INTO myschema.mytable VALUES

(UNIX_TIMESTAMP())

...

 

1.5.        刪除事件

使用如下語法可顯式刪除事件:

DROP EVENT [IF EXISTS] [schema_name.]event_name;

使用 IF EXISTS 可防止因嘗試刪除不存在的事件而出現的錯誤。您必須對包含要刪除的事件的資料庫擁有 EVENT 許可權。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16976507/viewspace-2646580/,如需轉載,請註明出處,否則將追究法律責任。

相關文章