本节讨论错误消息在 MySQL 中的来源以及它们包含的元素。
错误消息可能来自服务器端或客户端。
在服务器端,错误消息可能发生在启动和关闭过程中,也可能发生在执行 SQL 语句过程中遇到的问题等。
MySQL 服务器会将其错误消息写入其错误日志。这些消息指示数据库管理员关注的 issue 或需要 DBA 操作的 issue。
服务器会将其他错误消息发送到客户端程序。这些消息指示仅与特定客户端相关的 issue。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 操作的 issue
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:错误代码,保留用于第三方。
服务器处理写入错误日志的错误消息与发送到客户端的错误消息不同