這篇文章主要介紹“怎么理解MySQL的EVENT事件”,在日常操作中,相信很多人在怎么理解MySQL的EVENT事件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么理解MySQL的EVENT事件”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
創(chuàng)新互聯(lián)公司專注于企業(yè)成都營銷網(wǎng)站建設、網(wǎng)站重做改版、煙臺網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、HTML5建站、商城開發(fā)、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為煙臺等各大城市提供網(wǎng)站開發(fā)制作服務。
MySQL 事件是按調(diào)度表運行的任務。這些事件可稱為“調(diào)度事件”。創(chuàng)建事件時,會將其創(chuàng)建為命名數(shù)據(jù)庫對象,其中包含在特定時間執(zhí)行或定期重復發(fā)生的SQL 語句(或存儲過程)。這在概念上與Linux/UNIX crontab(也稱為“cron 作業(yè)”)或Windows 任務調(diào)度程序的理念類似。語法與相關語句如下:
CREATE EVENT event_name ON SCHEDULE schedule DO sql_statement
事件語句:
– SET GLOBAL event_scheduler = {ON | OFF}
– CREATE EVENT
– ALTER EVENT
– DROP EVENT
event_name:事件是模式對象,與表、存儲過程和觸發(fā)器一樣。event_name 必須是有效的標識符,且可以按正常方式通過模式名稱進行引用和/或限定。事件名稱在模式中必須是唯一的。
schedule:調(diào)度表是一種規(guī)則,用于指定MySQL 執(zhí)行與事件相關聯(lián)的操作的時間。
sql_statement:您必須包含按調(diào)度表執(zhí)行的有效SQL 語句或存儲過程語句。此語句受到的限制與適用于存儲函數(shù)和動態(tài)SQL 的限制相同。例如,該語句無法返回結果集(如SELECT 或SHOW 所生成的結果集)。通常會使用CALL 語句調(diào)用過程來執(zhí)行實際操作。
1.1. 調(diào)度表
調(diào)度表是指定應在何時執(zhí)行操作的規(guī)則。可以在CREATE EVENT 和ALTER EVENT 語句的SCHEDULE 子句中指定調(diào)度表。
有兩種類型的調(diào)度表:執(zhí)行一次的調(diào)度表(使用AT 關鍵字)和可重復執(zhí)行的調(diào)度表(使用EVERY 關鍵字)。對于后者,必須定義事件的重復頻率。還可以定義一個時間段,以確定應重復執(zhí)行事件的期限。
SCHEDULE 子句的語法如下所示:
AT timestamp [+ INTERVAL interval]| EVERY interval [STARTS timestamp [+ INTERVAL interval]] [ENDS timestamp [+ INTERVAL interval]]
SCHEDULE 子句可包含以下變量元素:
? timestamp:DATETIME 或TIMESTAMP 類型的表達式;
? interval:用于指定持續(xù)時間。持續(xù)時間的表示方法為,指定一個整數(shù)數(shù)量,后跟用于定義特定種類持續(xù)時間的關鍵字。有效的關鍵字包括:
- YEAR
- QUARTER
- MONTH
- DAY
- HOUR
- MINUTE
- WEEK
- SECOND
- YEAR_MONTH
- DAY_HOUR
- DAY_MINUTE
- DAY_SECOND
- HOUR_MINUTE
- HOUR_SECOND
- MINUTE_SECOND
事件調(diào)度程序是mysqld 進程中的一個單獨線程,負責執(zhí)行調(diào)度事件。調(diào)度程序會檢查是否應執(zhí)行事件;如果應執(zhí)行事件,則會創(chuàng)建新的連接來執(zhí)行操作。
使用事件來自動地定期執(zhí)行(維護)任務,如更新匯總表或刷新查詢中的表(物化視圖仿真),或者執(zhí)行夜間作業(yè)。例如,處理白天的工作、加載數(shù)據(jù)倉庫或者將數(shù)據(jù)導出到文件中。
1.2. 事件調(diào)度程序和權限
1) 事件調(diào)度程序
創(chuàng)建事件后,該事件將存儲在數(shù)據(jù)庫中,以便按調(diào)度表執(zhí)行。event_scheduler 線程會監(jiān)控所有事件的調(diào)度表,在到達調(diào)度表中的時間時,該線程會啟動一個新的線程來執(zhí)行每個事件。
默認情況下,event_scheduler 線程設置為OFF。您必須顯式啟用該線程,方法為修改全局event_scheduler 服務器變量的值,將其設置為ON。還可以通過將服務器變量添加到選項文件中(以便更改在啟動時生效)或動態(tài)使用SET 語法來實現(xiàn)。如果在event_scheduler 設置為DISABLED 的情況下啟動服務器,則無法在MySQL 正在運行時通過SET 語句將其啟用。而必須停止MySQL 并在啟用該選項的情況下重新啟動MySQL。
啟用event_scheduler 線程后,您可以在SHOW PROCESSLIST 的輸出(以及INFORMATION_SCHEMA 等效項PROCESSLIST)中看到該線程。
可以使用ALTER EVENT 語法更改EVENT。可以通過該語法更改EVENT 的每個元素。因此,ALTER EVENT 的語法模型幾乎與CREATE EVENT 語句的語法模型完全相同。
2) 事件調(diào)度權限
必須擁有SUPER 權限才能設置全局event_scheduler 變量。必須擁有EVENT 權限才能創(chuàng)建、修改或刪除事件。
? 使用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 權限不會刪除或禁用該帳戶已創(chuàng)建的任何事件。
用戶的EVENT 權限存儲在mysql.user 和mysql.db 表的Event_priv 列中。在這兩種情況下,該列均存儲值“Y”或“N”之一?!癗”是默認值。僅當給定用戶擁有全局EVENT 權限時,該用戶的mysql.user.Event_priv 值才會設為“Y”。對于模式級別的EVENT 權限,GRANT 會在mysql.db 中創(chuàng)建一個行,并按如下所示設置該行的列值:
l Db:模式的名稱
l User:用戶的名稱
l Event_priv:“Y”
您不必直接操作這些表,因為GRANT EVENT 和REVOKE EVENT 語句會對其執(zhí)行所需的操作。
1.3. 事件執(zhí)行權限
事件使用事件定義者的權限進行執(zhí)行。如果定義者無權執(zhí)行某任務,則事件無法執(zhí)行該任務。示例如下:
user1@srv1 只能為myschema 創(chuàng)建SELECT 事件:
CREATE EVENT e_store_ts ON SCHEDULE EVERY 10 SECOND
DO
INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP());
由于缺少INSERT 權限,該事件不會在表中創(chuàng)建任何行。事件使用其定義者的權限進行執(zhí)行,并且無法執(zhí)行定義者無權執(zhí)行的任何操作,了解這一點非常重要。例如,假設user1@srv1 擁有對myschema 的EVENT 權限。再假設該用戶擁有對myschema 的SELECT 權限,但是沒有針對此模式的其他權限。盡管user1@srv1 可以創(chuàng)建新事件,但該事件本身無法執(zhí)行INSERT 操作,因為定義者user1@srv1 無權執(zhí)行該操作。
錯誤日志
如果查看MySQL 錯誤日志(hostname.err) 可以看到事件正在執(zhí)行,但是該事件嘗試執(zhí)行的操作失?。ㄓ蒖etCode=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此語句顯示重新創(chuàng)建給定事件所需的CREATE EVENT 語句。必須提供事件名稱才能查看該事件的相關信息。
SHOW EVENTS此語句為MySQL 擴展。它可返回事件的特征,如數(shù)據(jù)庫、名稱、類型、創(chuàng)建者以及創(chuàng)建和修改日期。此語句有一個優(yōu)點:可基于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 可防止因嘗試刪除不存在的事件而出現(xiàn)的錯誤。您必須對包含要刪除的事件的數(shù)據(jù)庫擁有EVENT 權限。
到此,關于“怎么理解MySQL的EVENT事件”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
當前名稱:怎么理解MySQL的EVENT事件
標題URL:http://weahome.cn/article/jhjjci.html