在 MySQL 伺服器維護的記錄檔中,其中一個是錯誤記錄檔,它會將診斷訊息寫入其中 (請參閱第 7.4.2 節,「錯誤記錄檔」)。通常,伺服器會將診斷資訊寫入伺服器主機上的檔案或系統記錄服務。根據錯誤記錄檔組態,伺服器也可以將最新的錯誤事件寫入效能架構 error_log
資料表。因此,授予 error_log
資料表的 SELECT
權限,可讓用戶端和應用程式使用 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 9.0.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
欄位。在效能架構中,
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
表格除外)都有名為THREAD_ID
的欄位,但在這些表格中,THREAD_ID
欄位是效能架構內部指派的值。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
。
效能架構的 error_log
表格由錯誤日誌接收器元件填入,這些元件除了將格式化的錯誤事件寫入錯誤日誌之外,還會寫入表格。日誌接收器對效能架構的支援有兩個部分
目前,傳統格式的 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 |
上次寫入表格的時間 |