事件由一個特殊的事件排程器執行緒執行;當我們提到事件排程器時,實際上指的是這個執行緒。當執行時,具有 PROCESS
權限的使用者可以在 SHOW PROCESSLIST
的輸出中看到事件排程器執行緒及其目前狀態,如下面討論所示。
全域 event_scheduler
系統變數決定了事件排程器是否在伺服器上啟用並執行。它具有以下值之一,這些值會影響事件排程,如下所述:
ON
:事件排程器已啟動;事件排程器執行緒會執行,並執行所有排定的事件。ON
是event_scheduler
的預設值。當事件排程器為
ON
時,事件排程器執行緒會在SHOW PROCESSLIST
的輸出中列為守護程序,其狀態如下所示:mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 1 User: root Host: localhost db: NULL Command: Query Time: 0 State: NULL Info: show processlist *************************** 2. row *************************** Id: 2 User: event_scheduler Host: localhost db: NULL Command: Daemon Time: 3 State: Waiting for next activation Info: NULL 2 rows in set (0.00 sec)
可以將
event_scheduler
的值設定為OFF
來停止事件排程。OFF
:事件排程器已停止。事件排程器執行緒不會執行,不會顯示在SHOW PROCESSLIST
的輸出中,並且不會執行任何排定的事件。當事件排程器停止時(
event_scheduler
為OFF
),可以將event_scheduler
的值設定為ON
來啟動它。(請參閱下一項。)DISABLED
:此值會使事件排程器無法運作。當事件排程器為DISABLED
時,事件排程器執行緒不會執行(因此不會出現在SHOW PROCESSLIST
的輸出中)。此外,事件排程器的狀態無法在執行階段變更。
如果事件排程器狀態尚未設定為 DISABLED
,則可以使用 SET
在 ON
和 OFF
之間切換 event_scheduler
。也可以在設定此變數時使用 0
表示 OFF
,以及 1
表示 ON
。因此,可以在 mysql 用戶端中使用以下 4 個陳述式中的任何一個來開啟事件排程器:
SET GLOBAL event_scheduler = ON;
SET @@GLOBAL.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@GLOBAL.event_scheduler = 1;
同樣地,可以使用以下 4 個陳述式中的任何一個來關閉事件排程器:
SET GLOBAL event_scheduler = OFF;
SET @@GLOBAL.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@GLOBAL.event_scheduler = 0;
如果啟用了事件排程器,則啟用 super_read_only
系統變數會阻止它在 events
資料字典表格中更新事件「上次執行」時間戳記。這會導致事件排程器在下次嘗試執行排定的事件時停止,並在伺服器錯誤日誌中寫入訊息。(在這種情況下,event_scheduler
系統變數不會從 ON
變更為 OFF
。一個含義是,此變數會拒絕 DBA 意圖 啟用或停用事件排程器,其中其啟動或停止的實際狀態可能有所不同。)如果在啟用 super_read_only
之後隨後停用,伺服器會根據需要自動重新啟動事件排程器。
雖然 ON
和 OFF
具有數值等效值,但 event_scheduler
由 SELECT
或 SHOW VARIABLES
顯示的值始終是 OFF
、ON
或 DISABLED
。DISABLED
沒有數值等效值。因此,設定此變數時,通常首選 ON
和 OFF
,而不是 1
和 0
。
請注意,嘗試設定 event_scheduler
而未將其指定為全域變數會導致錯誤:
mysql< SET @@event_scheduler = OFF;
ERROR 1229 (HY000): Variable 'event_scheduler' is a GLOBAL
variable and should be set with SET GLOBAL
只能在伺服器啟動時將事件排程器設定為 DISABLED
。如果 event_scheduler
為 ON
或 OFF
,則無法在執行階段將其設定為 DISABLED
。此外,如果事件排程器在啟動時設定為 DISABLED
,則無法在執行階段變更 event_scheduler
的值。
若要停用事件排程器,請使用以下兩種方法之一:
作為啟動伺服器時的命令列選項:
--event-scheduler=DISABLED
在伺服器設定檔中(Windows 系統上的
my.cnf
或my.ini
),包含伺服器可以讀取的行(例如,在[mysqld]
區段中):event_scheduler=DISABLED
若要啟用事件排程器,請在不使用 --event-scheduler=DISABLED
命令列選項的情況下重新啟動伺服器,或者在伺服器設定檔中移除或註解掉包含 event-scheduler=DISABLED
的行(視情況而定)。或者,您可以在啟動伺服器時使用 ON
(或 1
) 或 OFF
(或 0
) 來取代 DISABLED
值。
當 event_scheduler
設定為 DISABLED
時,您可以發出事件操作語句。在這種情況下不會產生警告或錯誤(前提是語句本身有效)。然而,排定的事件無法執行,直到此變數設定為 ON
(或 1
) 為止。一旦完成此操作,事件排程器執行緒將執行所有滿足排程條件的事件。
使用 --skip-grant-tables
選項啟動 MySQL 伺服器會導致 event_scheduler
設定為 DISABLED
,覆蓋任何在命令列或 my.cnf
或 my.ini
檔案中設定的其他值(錯誤 #26807)。
有關用於建立、變更和刪除事件的 SQL 語句,請參閱第 27.4.3 節「事件語法」。
MySQL 在 INFORMATION_SCHEMA
資料庫中提供了一個 EVENTS
表。可以查詢此表以取得有關伺服器上已定義的排程事件的資訊。有關更多資訊,請參閱 第 27.4.4 節「事件元數據」 和 第 28.3.14 節「INFORMATION_SCHEMA EVENTS 表」。
有關事件排程和 MySQL 權限系統的資訊,請參閱 第 27.4.6 節「事件排程器和 MySQL 權限」。