本节讨论 MySQL 中错误消息的来源和它们包含的元素。
错误消息可以来自服务器端或客户端:
-
在服务器端,错误消息可能发生在启动和关闭过程中,或者是在 SQL 语句执行期间等。
-
MySQL 服务器将一些错误消息写入其错误日志中。这些消息表明了数据库管理员或需要 DBA 行动的问题。
-
服务器将其他错误消息发送给客户端程序。这些消息表明了与特定客户端相关的问题。
-
-
客户端错误消息来自 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
。
错误代码范围见 错误代码范围。
错误代码在通用可用性(GA)版本的 MySQL 系列中是稳定的。在系列达到 GA 状态之前,新的代码可能仍在开发中,并且可能会更改。
-
-
SQLSTATE 值:该值是一个五个字符的字符串(例如,
'42S02'
)。SQLSTATE 值来自 ANSI SQL 和 ODBC,并且比数字错误代码更标准化。-
类 =
'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 插件发送给客户端的消息。
-
10,000 到 49,999:服务器错误代码,保留用于写入错误日志(不发送给客户端)。
当此范围内发生错误时,服务器将其写入错误日志,使用六位数字的前导零填充,并添加前缀
MY-
。 -
50,000 到 51,999:错误代码,保留用于第三方使用。
服务器处理写入错误日志的错误消息与发送给客户端的错误消息不同: