• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 错误消息源和组件

    错误消息来源

    错误消息可能源自服务器端或客户端:

    • 在服务器端,由于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客户端所示:

    shell>mysql -h no-such-host
    ERROR 2005 (HY000): Unknown MySQL server host 'no-such-host' (0)
    

    无论错误是从客户端库内部产生还是从服务器接收到,MySQL客户端程序都可能以不同的方式响应。如刚刚所示,客户端可以显示错误消息,以便用户可以采取纠正措施。客户端可以改为在内部尝试解决或重试失败的操作,或采取其他措施。

    错误消息组件

    发生错误时,错误信息包括几个组件:错误代码,SQLSTATE值和消息字符串。这些组件具有以下特征:

    • 错误代码:此值为数字。它是特定于MySQL的,不能移植到其他数据库系统。

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

      • 服务器错误号的符号1146ER_NO_SUCH_TABLE
      • 客户端错误编号的符号2005CR_UNKNOWN_HOST

      错误消息中使用的错误代码集被划分为不同的范围。请参阅错误代码范围。

      错误代码在给定MySQL系列的一般可用性(GA)版本中稳定。在系列达到GA状态之前,新代码可能仍在开发中,并且可能会发生变化。

    • SQLSTATE值:该值是一个五个字符的字符串(例如'42S02')。SQLSTATE值取自ANSI SQL和ODBC,并且比数字错误代码更标准化。SQLSTATE值的前两个字符表示错误类别:

      • Class ='00'表示成功。
      • Class ='01'表示警告。
      • Class ='02'表示“未找到。”在游标的上下文中是相关的,用于控制游标到达数据集末尾时发生的情况。对于不检索行的语句,也会发生这种情况。SELECT ... INTO var_list
      • 类>'02'表示异常。

      对于服务器端错误,并非所有MySQL错误号都有相应的SQLSTATE值。在这些情况下,将使用'HY000'(一般错误)。

      对于客户端错误,SQLSTATE值始终为'HY000'(一般错误),因此对于区分一个客户端错误与另一个客户端错误没有意义。

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

    错误代码范围

    错误消息中使用的错误代码集分为不同的范围,每个范围都有自己的用途:

    • 至999:全局错误代码。此错误代码范围称为“全局”,因为它是服务器以及客户端使用的共享范围。

      当此范围的错误起源于服务器端时,服务器会将其写入错误日志,并在错误代码前添加前导零到六位数字,并添加前缀MY-

      当此范围内的错误起源于客户端时,客户端库会将其提供给客户端程序使用,而无需填充零或前缀。

    • ,000至1,999:服务器错误代码保留给发送给客户端的消息。
    • ,000到2,999:保留供客户端库使用的客户端错误代码。
    • ,000至4,999:保留服务器错误代码,用于发送给客户端的消息。
    • ,000到5,999:保留给X插件用于发送给客户端的消息的错误代码。
    • ,000到49,999:保留服务器错误代码,用于将消息写入错误日志(不发送给客户端)。

      当发生此范围内的错误时,服务器会将其写入错误日志,并在错误代码前添加前导零到六位数字,并添加前缀MY-

    • ,000到51,999:保留供第三方使用的错误代码。

    服务器处理写入错误日志的错误消息与发送给客户端的错误消息不同:

    • 服务器将消息写入错误日志时,它将错误代码填充到前导零到六位数字,并添加前缀MY-(例如:MY-000022MY-010048)。
    • 当服务器向客户端程序发送消息时,它不会在错误代码中添加零填充或前缀(示例:10363013)。