在 MySQL 伺服器維護的日誌中,其中一個是錯誤日誌,它會將診斷訊息寫入其中 (請參閱第 7.4.2 節,「錯誤日誌」)。 通常,伺服器會將診斷寫入伺服器主機上的檔案或系統日誌服務。 根據錯誤日誌組態,伺服器也可以將最近的錯誤事件寫入 Performance Schema error_log
資料表。 因此,授與 SELECT
權限給 error_log
資料表,即可讓用戶端和應用程式使用 SQL 查詢存取錯誤日誌內容,讓 DBA 能夠在不需要允許伺服器主機上的直接檔案系統存取的情況下,提供日誌存取權。
error_log
資料表支援根據其更結構化的欄位進行重點查詢。 它還包含錯誤訊息的完整文字,以支援更自由形式的分析。
資料表實作使用固定大小的記憶體環狀緩衝區,舊事件會自動捨棄,以便為新事件騰出空間。
error_log
內容範例
mysql> SELECT * FROM performance_schema.error_log\G
*************************** 1. row ***************************
LOGGED: 2020-08-06 09:25:00.338624
THREAD_ID: 0
PRIO: System
ERROR_CODE: MY-010116
SUBSYSTEM: Server
DATA: mysqld (mysqld 8.4.0) starting as process 96344
*************************** 2. row ***************************
LOGGED: 2020-08-06 09:25:00.363521
THREAD_ID: 1
PRIO: System
ERROR_CODE: MY-013576
SUBSYSTEM: InnoDB
DATA: InnoDB initialization has started.
...
*************************** 65. row ***************************
LOGGED: 2020-08-06 09:25:02.936146
THREAD_ID: 0
PRIO: Warning
ERROR_CODE: MY-010068
SUBSYSTEM: Server
DATA: CA certificate /var/mysql/sslinfo/cacert.pem is self signed.
...
*************************** 89. row ***************************
LOGGED: 2020-08-06 09:25:03.112801
THREAD_ID: 0
PRIO: System
ERROR_CODE: MY-013292
SUBSYSTEM: Server
DATA: Admin interface ready for connections, address: '127.0.0.1' port: 33062
error_log
資料表具有下列欄位。 如描述中所述,除了 DATA
欄位之外,所有欄位都對應於底層錯誤事件結構的欄位,該結構在 第 7.4.2.3 節,「錯誤事件欄位」中說明。
LOGGED
事件時間戳記,精確到微秒。
LOGGED
對應於錯誤事件的time
欄位,儘管具有某些潛在差異錯誤日誌中的
time
值會根據log_timestamps
系統變數設定顯示;請參閱早期啟動記錄輸出格式。LOGGED
欄使用TIMESTAMP
資料類型儲存值,該資料類型的值會以 UTC 儲存,但在擷取時會以目前的工作階段時區顯示;請參閱第 13.2.2 節,「DATE、DATETIME 和 TIMESTAMP 類型」。
若要以與錯誤日誌檔案中顯示的時區相同的時區顯示
LOGGED
值,請先依如下方式設定工作階段時區SET @@session.time_zone = @@global.log_timestamps;
如果
log_timestamps
值為UTC
,而且您的系統未安裝具名的時區支援 (請參閱第 7.1.15 節,「MySQL 伺服器時區支援」),請依如下方式設定時區SET @@session.time_zone = '+00:00';
THREAD_ID
MySQL 執行緒 ID。
THREAD_ID
對應於錯誤事件的thread
欄位。在 Performance Schema 中,
error_log
資料表中的THREAD_ID
欄與threads
資料表的PROCESSLIST_ID
欄最相似對於前景執行緒,
THREAD_ID
和PROCESSLIST_ID
代表連線識別碼。這與INFORMATION_SCHEMA
的PROCESSLIST
表格的ID
欄位中顯示的值相同,也與SHOW PROCESSLIST
輸出的Id
欄位中顯示的值相同,並由執行緒內的CONNECTION_ID()
函數傳回。對於背景執行緒,
THREAD_ID
為 0,而PROCESSLIST_ID
為NULL
。
除了
error_log
之外的許多 Performance Schema 表格都有一個名為THREAD_ID
的欄位,但在這些表格中,THREAD_ID
欄位是由 Performance Schema 內部指定的值。PRIO
事件的優先順序。允許的值為
System
、Error
、Warning
、Note
。PRIO
欄位基於錯誤事件的label
欄位,而該欄位本身又基於底層的數值prio
欄位值。ERROR_CODE
數值事件錯誤代碼。
ERROR_CODE
對應於錯誤事件的error_code
欄位。SUBSYSTEM
事件發生的子系統。
SUBSYSTEM
對應於錯誤事件的subsystem
欄位。DATA
錯誤事件的文字表示。此值的格式取決於產生
error_log
列的記錄接收器元件產生的格式。例如,如果記錄接收器是log_sink_internal
或log_sink_json
,則DATA
值分別以傳統或 JSON 格式表示錯誤事件。(請參閱第 7.4.2.9 節,「錯誤記錄輸出格式」。)由於可以重新設定錯誤記錄檔,以變更提供列給
error_log
表格的記錄接收器元件,而且不同的接收器產生不同的輸出格式,因此在不同時間寫入error_log
表格的列可能會具有不同的DATA
格式。
error_log
表格具有以下索引
(
LOGGED
)的主鍵(
THREAD_ID
)上的索引(
PRIO
)上的索引(
ERROR_CODE
)上的索引(
SUBSYSTEM
)上的索引
不允許對 error_log
表格使用 TRUNCATE TABLE
。
Performance Schema error_log
表格由錯誤記錄接收器元件填入,這些元件除了將格式化的錯誤事件寫入錯誤記錄檔之外,還會寫入表格。記錄接收器對 Performance Schema 的支援分為兩個部分
目前,傳統格式的 log_sink_internal
和 JSON 格式的 log_sink_json
接收器支援將新事件寫入 error_log
表格,並提供剖析器以讀取先前寫入的錯誤記錄檔。
log_error_services
系統變數控制要啟用哪些記錄元件以進行錯誤記錄。其值是一個記錄篩選器和記錄接收器元件的管線,當發生錯誤事件時,這些元件將從左到右執行。log_error_services
值與填入 error_log
表格有關,如下所示
在啟動時,伺服器會檢查
log_error_services
值,並從中選擇最左邊符合以下條件的記錄接收器如果沒有任何記錄接收器符合這些條件,則
error_log
表格會保持空白。否則,如果接收器提供剖析器,且記錄組態允許找到先前寫入的錯誤記錄檔,則伺服器會使用接收器剖析器讀取檔案的最後一部分,並將其中包含的舊事件寫入表格。然後,接收器會在新的錯誤事件發生時將其寫入表格。在執行階段,如果
log_error_services
的值變更,伺服器會再次檢查它,這次尋找最左邊已啟用的、支援error_log
表格的記錄接收器,無論它是否提供剖析器。如果不存在此類記錄接收器,則不會將其他錯誤事件寫入
error_log
表格。否則,新設定的接收器會在新的錯誤事件發生時將其寫入表格。
任何影響寫入錯誤記錄檔輸出的組態都會影響 error_log
表格的內容。這包括詳細程度、訊息抑制和訊息篩選等設定。它也適用於在啟動時從先前的記錄檔讀取的資訊。例如,如果先前伺服器執行個體以低詳細程度設定,則未寫入的訊息,如果目前的執行個體以較高的詳細程度設定讀取檔案,則不會變成可用。
error_log
表格是一個固定大小、記憶體中環形緩衝區的檢視,舊事件會自動丟棄,以騰出空間給新事件。如下表所示,多個狀態變數提供有關持續進行的 error_log
作業的資訊。
狀態變數 | 意義 |
---|---|
Error_log_buffered_bytes |
表格中使用的位元組數 |
Error_log_buffered_events |
表格中存在的事件數 |
Error_log_expired_events |
從表格中丟棄的事件數 |
Error_log_latest_write |
上次寫入表格的時間 |