B.1 错误消息源和组件
本节讨论错误消息如何在 MySQL 中产生以及它们包含的组件。
错误消息源
错误消息可能源自服务器端或 Client 端:
-
在服务器端,由于 SQL 语句执行期间发生的问题等,在启动和关闭过程中可能会出现错误消息。
-
MySQL 服务器将一些错误消息写入其错误日志。这些指示数据库 Management 员感兴趣的问题或需要 DBA 采取措施的问题。
- 服务器将其他错误消息发送到 Client 端程序。这些指示仅与特定 Client 端有关的问题。 MySQLClient 端库接收从服务器接收到的错误,并将其提供给主机 Client 端程序。
-
Client 端错误消息是从 MySQLClient 端库中生成的,通常涉及与服务器通信的问题。
写入错误日志的示例服务器端错误消息:
- 在启动过程中产生的此消息提供状态或进度指示器:
2018-09-26T14:46:06.326016Z 0 [Note] Skipping generation of SSL
certificates as options related to SSL are specified.
- 此消息指示需要 DBA 操作的问题:
2018-10-02T03:20:39.410387Z 0 [ERROR] Plugin 'InnoDB'
registration as a STORAGE ENGINE failed.
发送到 Client 端程序的示例服务器端错误消息,如mysqlClient 端所示:
mysql> SELECT * FROM no_such_table;
ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist
源自 Client 端库内部的示例 Client 端错误消息,如mysqlClient 端所示:
shell> mysql -h no-such-host
ERROR 2005 (HY000): Unknown MySQL server host 'no-such-host' (0)
无论错误是从 Client 端库内部产生还是从服务器接收到,MySQLClient 端程序都可能以不同的方式响应。如刚刚所示,Client 端可以显示错误消息,以便用户可以采取纠正措施。Client 端可以改为在内部尝试解决或重试失败的操作,或采取其他措施。
错误消息组件
发生错误时,错误信息包括几个组成部分:错误代码,SQLSTATE 值和消息字符串。这些组件具有以下 Feature:
- 错误代码:此值为数字。它是 MySQL 特定的,不能移植到其他数据库系统。
每个错误号都有一个对应的符号值。例子:
-
服务器错误号
1146
的符号为ER_NO_SUCH_TABLE。- Client 端错误编号
2005
的符号为CR_UNKNOWN_HOST。
- Client 端错误编号
错误代码在给定 MySQL 系列的一般可用性(GA)版本中稳定。在系列达到 GA 状态之前,新代码可能仍在开发中,并且可能会发生变化。
-
SQLSTATE 值:该值是一个五个字符的字符串(例如
'42S02'
)。 SQLSTATE 值取自 ANSI SQL 和 ODBC,并且比数字错误代码更标准化。 SQLSTATE 值的前两个字符指示错误类别: -
Class =
'00'
table 示成功。-
Class =
'01'
table 示警告。 -
Class =
'02'
table 示“未找到”。这在游标的上下文中是相关的,用于控制游标到达数据集末尾时发生的情况。对于不检索任何行的SELECT ... INTO var_list
语句,也会发生这种情况。 -
类别>
'02'
table 示异常。
-
对于服务器端错误,并非所有 MySQL 错误号都有相应的 SQLSTATE 值。在这些情况下,将使用'HY000'
(一般错误)。
对于 Client 端错误,SQLSTATE 值始终为'HY000'
(一般错误),因此对于区分一个 Client 端错误和另一个 Client 端错误没有意义。
- 消息字符串:此字符串提供错误的文本描述。