您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么理解MySQL的EVENT事件”,在日常操作中,相信很多人在怎么理解MySQL的EVENT事件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么理解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 權限。
到此,關于“怎么理解MySQL的EVENT事件”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。