在 MySQL 9.0 中,錯誤記錄使用 第 7.5 節「MySQL 組件」中所述的 MySQL 組件架構。錯誤日誌子系統由執行日誌事件篩選和寫入的組件,以及一個設定要載入和啟用哪些組件以達到所需記錄結果的系統變數組成。
本節討論如何載入和啟用錯誤記錄的組件。有關日誌篩選器的特定說明,請參閱第 7.4.2.4 節「錯誤日誌篩選類型」。有關 JSON 和系統日誌接收器的特定說明,請參閱第 7.4.2.7 節「JSON 格式的錯誤記錄」和第 7.4.2.8 節「將錯誤記錄到系統日誌」。有關所有可用日誌組件的其他詳細資訊,請參閱第 7.5.3 節「錯誤日誌組件」。
基於組件的錯誤記錄提供以下功能
可由篩選組件篩選的日誌事件,以影響可供寫入的資訊。
由接收器(寫入器)組件輸出的日誌事件。可以啟用多個接收器組件,將錯誤日誌輸出寫入到多個目的地。
實作預設錯誤日誌格式的內建篩選器和接收器組件。
啟用 JSON 格式記錄的可載入接收器。
啟用記錄到系統日誌的可載入接收器。
控制要載入和啟用哪些日誌組件以及每個組件如何運作的系統變數。
本節的以下主題說明錯誤日誌配置
log_error_services
系統變數控制要載入哪些可載入日誌組件,以及要啟用哪些日誌組件進行錯誤記錄。預設情況下,log_error_services
的值如下所示
mysql> SELECT @@GLOBAL.log_error_services;
+----------------------------------------+
| @@GLOBAL.log_error_services |
+----------------------------------------+
| log_filter_internal; log_sink_internal |
+----------------------------------------+
該值表示日誌事件首先通過 log_filter_internal
篩選組件,然後通過 log_sink_internal
接收器組件,這兩個組件都是內建組件。篩選器會修改 log_error_services
值中稍後命名的組件看到的日誌事件。接收器是日誌事件的目的地。通常,接收器會將日誌事件處理成具有特定格式的日誌訊息,並將這些訊息寫入到其相關聯的輸出,例如檔案或系統日誌。
log_filter_internal
和 log_sink_internal
的組合會實作預設的錯誤日誌篩選和輸出行為。這些組件的動作會受到其他伺服器選項和系統變數的影響
輸出目的地由
--log-error
選項決定 (在 Windows 上,則由--pid-file
和--console
決定)。這些選項決定是否將錯誤訊息寫入主控台或檔案,如果是寫入檔案,則決定錯誤日誌檔名。請參閱第 7.4.2.2 節,「預設錯誤日誌目的地配置」。log_error_verbosity
和log_error_suppression_list
系統變數會影響log_filter_internal
允許或抑制哪些類型的日誌事件。請參閱第 7.4.2.5 節,「基於優先順序的錯誤日誌篩選 (log_filter_internal)」。
在配置 log_error_services
時,請注意以下特性:
日誌元件清單可以用分號或逗號分隔,後面可選擇性地加上空格。給定的設定不能同時使用分號和逗號分隔符。元件順序很重要,因為伺服器會按照列出的順序執行元件。
log_error_services
值中的最後一個元件不能是篩選器。這是一個錯誤,因為它對事件的任何變更都不會影響輸出。mysql> SET GLOBAL log_error_services = 'log_filter_internal'; ERROR 1231 (42000): Variable 'log_error_services' can't be set to the value of 'log_filter_internal'
要修正此問題,請在值的末尾包含一個接收器。
mysql> SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
在
log_error_services
中命名的元件順序很重要,特別是關於篩選器和接收器的相對順序。考慮以下log_error_services
值:log_filter_internal; log_sink_1; log_sink_2
在此情況下,日誌事件會傳遞到內建篩選器,然後傳遞到第一個接收器,然後傳遞到第二個接收器。兩個接收器都會收到篩選後的日誌事件。
將其與以下
log_error_services
值進行比較:log_sink_1; log_filter_internal; log_sink_2
在此情況下,日誌事件會傳遞到第一個接收器,然後傳遞到內建篩選器,然後傳遞到第二個接收器。第一個接收器會收到未篩選的事件。第二個接收器會收到篩選後的事件。如果您想要一個包含所有日誌事件訊息的日誌,以及另一個只包含部分日誌事件訊息的日誌,您可以這樣配置錯誤日誌。
錯誤日誌配置涉及根據需要載入和啟用錯誤日誌元件,並執行元件特定的配置。
有兩種錯誤日誌配置方法:隱式和顯式。建議選擇一種配置方法並專門使用。同時使用兩種方法可能會在啟動時導致警告。如需更多資訊,請參閱疑難排解配置問題。
隱式錯誤日誌配置
此配置方法會載入並啟用
log_error_services
變數定義的日誌元件。在InnoDB
儲存引擎完全可用之前,尚未載入的可載入元件會在啟動時隱式載入。此配置方法具有以下優點:日誌元件會在啟動順序的早期載入,在
InnoDB
儲存引擎之前,使記錄的資訊能更快地可用。它避免了在啟動期間發生故障時緩衝的日誌資訊遺失。
不需要使用
INSTALL COMPONENT
安裝錯誤日誌元件,簡化了錯誤日誌配置。
要使用此方法,請參閱隱式錯誤日誌配置。
顯式錯誤日誌配置
注意此配置方法支援向後相容性。建議使用隱式配置方法。
此配置方法需要使用
INSTALL COMPONENT
載入錯誤日誌元件,然後配置log_error_services
來啟用日誌元件。INSTALL COMPONENT
會將元件新增到mysql.component
表格 (一個InnoDB
表格),並且要在啟動時載入的元件會從這個表格讀取,而此表格只有在InnoDB
初始化後才能存取。在
InnoDB
儲存引擎初始化期間,記錄的資訊會在啟動順序期間緩衝,而InnoDB
啟動順序期間可能會因復原和資料字典升級等作業而延長。要使用此方法,請參閱顯式錯誤日誌配置。
此程序描述如何使用 log_error_services
隱式載入和啟用錯誤日誌元件。有關錯誤日誌配置方法的討論,請參閱錯誤日誌配置方法。
要隱式載入和啟用錯誤日誌元件:
在
log_error_services
值中列出錯誤日誌元件。要在伺服器啟動時載入並啟用錯誤日誌元件,請在選項檔案中設定
log_error_services
。以下範例除了內建的日誌篩選器和接收器 (log_filter_internal
、log_sink_internal
) 之外,還配置了 JSON 日誌接收器 (log_sink_json
) 的使用。[mysqld] log_error_services='log_filter_internal; log_sink_internal; log_sink_json'
注意要使用 JSON 日誌接收器 (
log_sink_syseventlog
) 而不是預設接收器 (log_sink_internal
),您會將log_sink_internal
替換為log_sink_json
。要立即載入並啟用該元件,並用於後續重新啟動,請使用
SET PERSIST
設定log_error_services
。SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
如果錯誤日誌元件公開任何必須設定才能成功初始化元件的系統變數,請為這些變數指定適當的值。您可以在選項檔案中或使用
SET PERSIST
設定這些變數。重要在實作隱式配置時,請先設定
log_error_services
以載入元件並公開其系統變數,然後再設定元件系統變數。無論變數指派是在命令列、選項檔案中執行,還是使用SET PERSIST
執行,都必須遵循此配置順序。
要停用日誌元件,請從 log_error_services
值中移除它。同時移除您已定義的任何相關元件變數設定。
使用 log_error_services
隱式載入日誌元件不會影響 mysql.component
表格。它不會將元件新增到 mysql.component
表格,也不會從 mysql.component
表格中移除先前使用 INSTALL COMPONENT
安裝的元件。
此程序描述如何透過使用 INSTALL COMPONENT
載入元件,然後使用 log_error_services
啟用來顯式載入和啟用錯誤日誌元件。有關錯誤日誌配置方法的討論,請參閱錯誤日誌配置方法。
要顯式載入和啟用錯誤日誌元件:
使用
INSTALL COMPONENT
載入元件 (除非它是內建的或已載入)。例如,要載入 JSON 日誌接收器,請發出以下陳述式:INSTALL COMPONENT 'file://component_log_sink_json';
使用
INSTALL COMPONENT
載入元件會將其註冊到mysql.component
系統表格中,以便伺服器在後續啟動時,於InnoDB
初始化後自動載入它。使用
INSTALL COMPONENT
載入日誌元件時要使用的 URN 是以file://component_
為字首的元件名稱。例如,對於log_sink_json
元件,對應的 URN 是file://component_log_sink_json
。如需錯誤日誌元件 URN,請參閱第 7.5.3 節,「錯誤日誌元件」。如果錯誤日誌元件公開任何必須設定才能成功初始化元件的系統變數,請為這些變數指定適當的值。您可以在選項檔案中或使用
SET PERSIST
設定這些變數。透過在
log_error_services
值中列出它來啟用該元件。重要當使用
INSTALL COMPONENT
顯式載入日誌元件時,請不要在選項檔案中保留或設定log_error_services
,這會在啟動時隱式載入日誌元件。相反地,請使用SET GLOBAL
陳述式在執行階段啟用日誌元件。以下範例除了內建的日誌篩選器和接收器 (
log_filter_internal
、log_sink_internal
) 之外,還配置了 JSON 日誌接收器 (log_sink_json
) 的使用。SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
注意要使用 JSON 日誌接收器 (
log_sink_syseventlog
) 而不是預設接收器 (log_sink_internal
),您會將log_sink_internal
替換為log_sink_json
。
要停用日誌元件,請從 log_error_services
值中移除它。然後,如果該元件是可載入的,並且您也想卸載它,請使用 UNINSTALL COMPONENT
。同時移除您已定義的任何相關元件變數設定。
嘗試使用 UNINSTALL COMPONENT
來卸載仍在 log_error_services
值中命名的可載入組件會產生錯誤。
如果您先前使用 INSTALL COMPONENT
明確載入錯誤日誌組件,並且想要切換到如 隱含的錯誤日誌組態 中所述的隱含組態,建議執行以下步驟
將
log_error_services
設回其預設組態。SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
使用
UNINSTALL COMPONENT
來卸載您先前安裝的任何可載入記錄組件。例如,如果您先前安裝了 JSON 日誌接收器,請如下所示將其卸載UNINSTALL COMPONENT 'file://component_log_sink_json';
移除已卸載組件的任何組件變數設定。例如,如果組件變數是在選項檔案中設定的,請從選項檔案中移除這些設定。如果組件變數是使用
SET PERSIST
設定的,請使用RESET PERSIST
來清除這些設定。依照 隱含的錯誤日誌組態 中的步驟來重新實作您的組態。
如果您需要從隱含組態回復為明確組態,請執行以下步驟
將
log_error_services
設回其預設組態,以卸載隱含載入的日誌組件。SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
移除與已卸載組件關聯的任何組件變數設定。例如,如果組件變數是在選項檔案中設定的,請從選項檔案中移除這些設定。如果組件變數是使用
SET PERSIST
設定的,請使用RESET PERSIST
來清除這些設定。重新啟動伺服器以卸載隱含載入的日誌組件。
依照 明確的錯誤日誌組態 中的步驟來重新實作您的組態。
在啟動時,log_error_services
值中列出的日誌組件會在 MySQL 伺服器啟動序列的早期隱含載入。如果日誌組件先前是使用 INSTALL COMPONENT
載入的,則伺服器會在啟動序列的稍後嘗試再次載入該組件,這會產生警告 無法從指定的 URN 載入組件:'file://component_component_name
'。
您可以在錯誤日誌中或使用以下查詢來查詢 Performance Schema error_log
表格來檢查此警告
SELECT error_code, data
FROM performance_schema.error_log
WHERE data LIKE "%'file://component_%"
AND error_code="MY-013129" AND data LIKE "%MY-003529%";
為了防止此警告,請依照 變更錯誤日誌組態方法 中的指示來調整您的錯誤日誌組態。應該使用隱含或明確的錯誤日誌組態,但不能兩者都使用。
嘗試明確載入在啟動時隱含載入的組件時,會發生類似的錯誤。例如,如果 log_error_services
列出 JSON 日誌接收器組件,則該組件會在啟動時隱含載入。稍後嘗試明確載入相同的組件會傳回此錯誤
mysql> INSTALL COMPONENT 'file://component_log_sink_json';
ERROR 3529 (HY000): Cannot load component from specified URN: 'file://component_log_sink_json'.
可以設定多個日誌接收器,這可以將輸出傳送到多個目的地。若要除了預設接收器之外(而不是取代)啟用 JSON 日誌接收器,請將 log_error_services
值設定如下
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
若要回復為僅使用預設接收器並卸載系統日誌接收器,請執行以下語句
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal;
UNINSTALL COMPONENT 'file://component_log_sink_json';
如果已啟用的日誌組件包含提供 Performance Schema 支援的接收器,則寫入錯誤日誌的事件也會寫入 Performance Schema error_log
表格。這可以使用 SQL 查詢來檢查錯誤日誌的內容。目前,傳統格式的 log_sink_internal
和 JSON 格式的 log_sink_json
接收器支援此功能。請參閱 第 29.12.22.2 節,「error_log 表格」。