B.1 错误消息来源和元素
本节讨论 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
。
错误代码在错误消息中使用的集合被分区到不同的范围中;请参阅Error Code Ranges。
错误代码在MySQL系列的General Availability(GA)版本之间保持稳定。一个系列还没有达到GA状态时,新的代码可能仍在开发中且可能会更改。
-
-
SQLSTATE值:这个值是一个五个字符的字符串(例如:
'42S02'
)。SQLSTATE值来自ANSI SQL和ODBC,并且比数字错误代码更加标准化。SQLSTATE值中的前两个字符表示错误类别:-
Class =
'00'
表示成功。 -
Class =
'01'
表示警告。 -
Class =
'02'
表示“not found.”这在游标的上下文中是有意义的,用于控制游标何时到达数据集的末尾。此条件也适用于SELECT ... INTO
语句,该语句检索零行记录。var_list
-
Class >
'02'
表示异常。
对于服务器端错误,不是所有MySQL错误号都有相应的SQLSTATE值。在这些情况下,
'HY000'
(general error)被使用。对于客户端错误,SQLSTATE值总是
'HY000'
(general error),因此它不能用来区分一个客户端错误与另一个客户端错误。 -
-
消息字符串:这个字符串提供了错误的文本描述。
错误代码在错误消息中使用的集合被分区到不同的范围,每个范围都有其自己的目的是:
-
1 到 999:全局错误代码。这类错误代码称为““global””因为它是服务器和客户端共享的范围。
当来自服务器端的错误在这个范围内时,服务器将其写入到错误日志中,将错误代码填充到六位数字,并添加前缀
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:错误代码保留用于第三方使用。
服务器对写入到错误日志中的错误消息和向客户端发送的错误消息进行了不同的处理: