事件是由特殊的事件排程器執行緒執行;當我們提到事件排程器時,實際上指的是這個執行緒。執行時,擁有 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
,則可以在 ON
和 OFF
之間切換 event_scheduler
(使用 SET
)。也可以在設定此變數時使用 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.5.3 節「事件語法」。
MySQL 在 INFORMATION_SCHEMA
資料庫中提供一個 EVENTS
資料表。可以查詢此資料表以取得伺服器上已定義的排程事件的相關資訊。請參閱第 27.5.4 節,「事件元數據」和 第 28.3.14 節,「INFORMATION_SCHEMA EVENTS 資料表」以取得更多資訊。
有關事件排程和 MySQL 權限系統的資訊,請參閱第 27.5.6 節,「事件排程器和 MySQL 權限」。