本节讨论错误消息在 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:错误代码,保留供第三方使用。
服务器对写入错误日志的错误消息和发送到客户端的错误消息的处理方式不同