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 特定的,不能移植到其他数据库系统。

每个错误号都有一个对应的符号值。例子:

错误代码在给定 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 端错误没有意义。

  • 消息字符串:此字符串提供错误的文本描述。