文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  錯誤日誌配置

7.4.2.1 錯誤日誌配置

在 MySQL 8.4 中,錯誤日誌記錄使用第 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_internallog_sink_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 隱式載入並啟用錯誤日誌元件。有關錯誤日誌設定方法的討論,請參閱錯誤日誌設定方法

若要隱式載入並啟用錯誤日誌元件:

  1. log_error_services 值中列出錯誤日誌元件。

    若要在伺服器啟動時載入並啟用錯誤日誌元件,請在選項檔案中設定 log_error_services。以下範例設定除了內建的日誌篩選器和接收器 (log_filter_internallog_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';
  2. 如果錯誤日誌元件公開任何必須設定才能使元件初始化成功的系統變數,請將這些變數設定為適當的值。您可以在選項檔案中或使用 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 啟用元件,來顯式載入和啟用錯誤日誌元件。有關錯誤日誌設定方法的討論,請參閱錯誤日誌設定方法

若要顯式載入並啟用錯誤日誌元件:

  1. 使用 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 節「錯誤日誌元件」

  2. 如果錯誤日誌元件公開任何必須設定才能使元件初始化成功的系統變數,請將這些變數設定為適當的值。您可以在選項檔案中或使用 SET PERSIST 設定這些變數。

  3. 通過在 log_error_services 值中列出該元件來啟用它。

    重要

    當使用 INSTALL COMPONENT 明確載入記錄組件時,請勿在選項檔案中保留或設定 log_error_services,因為它會在啟動時隱式載入記錄組件。請改用 SET GLOBAL 陳述式在執行階段啟用記錄組件。

    以下範例除了內建的記錄篩選器和接收器(log_filter_internallog_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 明確載入錯誤記錄組件,並想要切換到如 隱式錯誤記錄組態 中所述的隱式組態,建議執行下列步驟

  1. log_error_services 還原為其預設組態。

    SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
  2. 使用 UNINSTALL COMPONENT 來卸載您先前安裝的任何可載入記錄組件。例如,如果您先前安裝了 JSON 記錄接收器,請如下所示卸載它

    UNINSTALL COMPONENT 'file://component_log_sink_json';
  3. 移除已卸載組件的任何組件變數設定。例如,如果組件變數是在選項檔案中設定的,請從選項檔案中移除這些設定。如果組件變數是使用 SET PERSIST 設定的,請使用 RESET PERSIST 來清除這些設定。

  4. 按照 隱式錯誤記錄組態 中的步驟來重新實作您的組態。

如果您需要從隱式組態還原為明確組態,請執行下列步驟

  1. log_error_services 還原為其預設組態,以卸載隱式載入的記錄組件。

    SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
  2. 移除與已卸載組件相關聯的任何組件變數設定。例如,如果組件變數是在選項檔案中設定的,請從選項檔案中移除這些設定。如果組件變數是使用 SET PERSIST 設定的,請使用 RESET PERSIST 來清除這些設定。

  3. 重新啟動伺服器以卸載隱式載入的記錄組件。

  4. 按照 明確錯誤記錄組態 中的步驟來重新實作您的組態。

組態問題疑難排解

在啟動時,log_error_services 值中列出的記錄組件會在 MySQL 伺服器啟動序列的早期被隱式載入。如果記錄組件先前是使用 INSTALL COMPONENT 載入的,則伺服器會在啟動序列的稍後嘗試再次載入該組件,這會產生警告 無法從指定的 URN 載入組件:'file://component_組件名稱'

您可以在錯誤記錄中檢查此警告,或使用以下查詢來查詢效能架構 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';
記錄接收器效能架構支援

如果已啟用的記錄組件包含提供效能架構支援的接收器,則寫入錯誤記錄的事件也會寫入效能架構 error_log 表格。這可以使用 SQL 查詢來檢查錯誤記錄內容。目前,傳統格式的 log_sink_internal 和 JSON 格式的 log_sink_json 接收器支援此功能。請參閱 第 29.12.22.2 節,「error_log 表格」