本節討論錯誤訊息如何在 MySQL 中產生,以及它們包含的元素。
錯誤訊息可能源自伺服器端或用戶端。
在伺服器端,錯誤訊息可能會在啟動和關閉過程中發生,也可能因為執行 SQL 陳述式時發生的問題而產生,等等。
MySQL 伺服器會將一些錯誤訊息寫入其錯誤記錄檔。這些訊息會指出資料庫管理員感興趣的問題,或需要 DBA 採取動作的問題。
伺服器會將其他錯誤訊息傳送給用戶端程式。這些訊息會指出僅與特定用戶端相關的問題。MySQL 用戶端程式庫會接收來自伺服器的錯誤,並使其可供主機用戶端程式使用。
用戶端錯誤訊息會在 MySQL 用戶端程式庫內產生,通常與和伺服器通訊的問題有關。
寫入錯誤記錄檔的伺服器端錯誤訊息範例
在啟動過程中產生的此訊息會提供狀態或進度指示
2018-10-28T13:01:32.735983Z 0 [Note] [MY-010303] [Server] Skipping generation of SSL certificates as options related to SSL are specified.
此訊息會指出需要 DBA 採取動作的問題
2018-10-02T03:20:39.410387Z 768 [ERROR] [MY-010045] [Server] Event Scheduler: [evtuser@localhost][myschema.e_daily] Unknown database 'mydb'
傳送至用戶端程式的伺服器端錯誤訊息範例,如 mysql 用戶端所顯示
mysql> SELECT * FROM no_such_table;
ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist
源自用戶端程式庫內的用戶端錯誤訊息範例,如 mysql 用戶端所顯示
$> mysql -h no-such-host
ERROR 2005 (HY000): Unknown MySQL server host 'no-such-host' (-2)
無論錯誤源自用戶端程式庫內或接收自伺服器,MySQL 用戶端程式可能會以各種不同的方式回應。如剛才所示,用戶端可能會顯示錯誤訊息,以便使用者可以採取更正措施。用戶端可能會在內部嘗試解決或重試失敗的操作,或採取其他動作。
發生錯誤時,錯誤資訊會包含數個元素:錯誤代碼、SQLSTATE 值和訊息字串。這些元素具有下列特性
錯誤代碼:此值為數值。它是 MySQL 特有的,無法移植到其他資料庫系統。
每個錯誤編號都有對應的符號值。範例
伺服器錯誤編號
1146
的符號為ER_NO_SUCH_TABLE
。用戶端錯誤編號
2005
的符號為CR_UNKNOWN_HOST
。
錯誤訊息中使用的錯誤代碼集會分割為不同的範圍;請參閱錯誤代碼範圍。
錯誤代碼在特定 MySQL 系列的正式發行 (GA) 版本之間是穩定的。在系列達到 GA 狀態之前,新的代碼可能仍在開發中,並且可能會變更。
SQLSTATE 值:此值為五字元的字串(例如,
'42S02'
)。SQLSTATE 值取自 ANSI SQL 和 ODBC,比數值錯誤代碼更標準化。SQLSTATE 值的前兩個字元會指出錯誤類別類別 =
'00'
表示成功。類別 =
'01'
表示警告。類別 =
'02'
表示「「找不到。」」這與游標的內容相關,並用於控制當游標到達資料集結尾時發生的情況。此狀況也會發生在擷取不到資料列的SELECT ... INTO
陳述式中。var_list
類別 >
'02'
表示例外狀況。
對於伺服器端錯誤,並非所有 MySQL 錯誤編號都有對應的 SQLSTATE 值。在這些情況下,會使用
'HY000'
(一般錯誤)。對於用戶端錯誤,SQLSTATE 值一律為
'HY000'
(一般錯誤),因此對於區分不同用戶端錯誤沒有意義。訊息字串:此字串提供錯誤的文字描述。
錯誤訊息中使用的錯誤代碼集會分割為不同的範圍,每個範圍都有其自己的用途
1 到 999:全域錯誤代碼。此錯誤代碼範圍稱為「「全域」」,因為它是伺服器和用戶端共用的範圍。
當此範圍內的錯誤源自伺服器端時,伺服器會將其寫入錯誤記錄檔,並以開頭零填補錯誤代碼至六位數,並新增前置字元
MY-
。當此範圍內的錯誤源自用戶端時,用戶端程式庫會將其提供給用戶端程式,而不會填補零或新增前置字元。
1,000 到 1,999:保留供傳送至用戶端的訊息使用的伺服器錯誤代碼。
2,000 到 2,999:保留供用戶端程式庫使用的用戶端錯誤代碼。
3,000 到 4,999:保留供傳送至用戶端的訊息使用的伺服器錯誤代碼。
5,000 到 5,999:保留供 X Plugin 使用的錯誤代碼,用於傳送至用戶端的訊息。
10,000 到 49,999:保留供寫入錯誤記錄檔的訊息使用的伺服器錯誤代碼(不傳送至用戶端)。
當此範圍內的錯誤發生時,伺服器會將其寫入錯誤記錄檔,並以開頭零填補錯誤代碼至六位數,並新增前置字元
MY-
。50,000 到 51,999:保留供協力廠商使用的錯誤代碼。
伺服器處理寫入錯誤日誌的錯誤訊息,方式與傳送給用戶端的錯誤訊息不同。