文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
手冊頁 (TGZ) - 258.2Kb
手冊頁 (Zip) - 365.3Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


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

7.4.2.1 錯誤日誌配置

在 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_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_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 支援的接收器,則寫入錯誤日誌的事件也會寫入 Performance Schema error_log 表格。這可以使用 SQL 查詢來檢查錯誤日誌的內容。目前,傳統格式的 log_sink_internal 和 JSON 格式的 log_sink_json 接收器支援此功能。請參閱 第 29.12.22.2 節,「error_log 表格」