本节讨论错误消息是如何在MySQL中产生的以及它们所包含的元素。
错误消息可以产生于服务器端或客户端:
在服务器端,由于SQL语句执行期间发生的问题等,在启动和关闭过程中可能会出现错误消息。
MySQL服务器将一些错误消息写入错误日志。这些指示了数据库管理员感兴趣的问题或需要DBA采取行动的问题。
服务器向客户端程序发送其他错误消息。这些指示只与特定客户相关的问题。MySQL客户端库接收来自服务器的错误,并将它们提供给主机客户端程序。
客户端错误消息是从MySQL客户端库中生成的,通常涉及到与服务器通信的问题。
写入错误日志的服务器端错误消息示例:
这个在启动过程中产生的消息提供了一个状态或进度指示器:
2018-10-28T13:01:32.735983Z 0[备注][MY-010303][服务器]指定SSL相关选项,跳过生成SSL证书。
这条消息表明需要DBA采取行动的问题:
2018-10-02t03:20 . 39. 410387z 768 [ERROR] [MY-010045] [Server] Event Scheduler: [evtuser@localhost][myschema.]未知数据库“mydb”
发送到客户端程序的服务器端错误消息示例,如mysql客户:
mysql> SELECT * FROM no_such_table;错误1146 (42S02):表的测试。No_such_table '不存在
起源于客户端库的示例客户端错误消息,如mysql客户:
shell> mysql -h no-such-host ERROR 2005 (HY000):未知的mysql服务器'no-such-host' (0)
无论错误是来自客户端库内部还是来自服务器,MySQL客户端程序都可能以不同的方式进行响应。如刚才所示,客户端可能会显示错误消息,以便用户可以采取纠正措施。客户端可以在内部尝试解决或重试失败的操作,或者采取其他操作。
当发生错误时,错误信息包括几个元素:错误代码、SQLSTATE值和消息字符串。这些元素具有以下特点:
错误码:此值为数字。它是特定于mysql的,不能移植到其他数据库系统。
每个错误数都有一个对应的符号值。例子:
服务器错误编号的符号
1146
是ER_NO_SUCH_TABLE
.客户端错误编号的符号
2005
是CR_UNKNOWN_HOST
.
错误消息中使用的错误代码集被划分为不同的范围;看到错误码范围.
在给定MySQL系列的通用可用性(GA)版本中,错误代码是稳定的。在一个系列达到GA状态之前,新的代码可能仍在开发中,并且可能会发生变化。
SQLSTATE值:5个字符的字符串,例如:
“42 s02”
).SQLSTATE值取自ANSI SQL和ODBC,比数字错误代码更加标准化。SQLSTATE值的前两个字符表示错误类:类=
“00”
表示成功。类=
“01”
警告。类=
“2”
表明”没有找到。”这在游标上下文中是相关的,用于控制游标到达数据集末尾时会发生什么。这种情况也发生在选择……成
不检索行的语句。var_list
类>
“2”
表示异常。
对于服务器端错误,并不是所有MySQL错误数都有相应的SQLSTATE值。在这些情况下,
“HY000”
(一般错误)被使用。对于客户端错误,SQLSTATE值总是
“HY000”
(一般错误),因此区分一个客户端错误与另一个客户端错误是没有意义的。消息字符串:此字符串提供错误的文本描述。
错误消息中使用的错误代码集被划分为不同的范围,每个范围都有自己的目的:
1 ~ 999:全局错误码。这个错误代码范围被调用”全球”因为它是服务器和客户端都使用的共享范围。
当服务器端出现此范围内的错误时,服务器将其写入错误日志,用前导零填充到6位数字,并添加前缀
我- - - - - -
.当客户端出现此范围内的错误时,客户端库将其提供给客户端程序,不带零填充或前缀。
1000 ~ 1999:发送给客户端的服务器错误码。
2000 ~ 2999:客户端错误码,保留给客户端库使用。
3000 ~ 4999:发送给客户端的服务器错误码。
5000 ~ 5999:为X Plugin保留用于发送到客户端的消息的错误码。
10000 ~ 49999:服务器错误码,用于写入错误日志的消息(不发送到客户端)。
当发生此范围内的错误时,服务器将其写入错误日志,用前导零填充到6位数字,并添加前缀
我- - - - - -
.50000 ~ 51,999:为第三方保留的错误码。
服务器处理写入错误日志的错误消息与处理发送给客户端的错误消息不同:
当服务器向错误日志写入消息时,它将错误代码的前导零填充为6位数字,并添加一个前缀
我- - - - - -
(例子:我的- 000022
,我的- 010048
).