B.4.2.8 MySQL 服务器不见了

本节还介绍了相关的Lost connection to server during query错误。

出现MySQL server has gone away错误的最常见原因是服务器超时并关闭了连接。在这种情况下,您通常会获得以下错误代码之一(所获得的错误代码与 os 有关)。

Error CodeDescription
CR_SERVER_GONE_ERRORClient 端无法向服务器发送问题。
CR_SERVER_LOSTClient 端在写入服务器时没有收到错误,但是没有得到问题的完整答案(或任何答案)。

默认情况下,如果什么都没发生,服务器将在八小时后关闭连接。您可以在启动mysqld时通过设置wait_timeout来更改时间限制。参见第 5.1.7 节“服务器系统变量”

如果有脚本,则只需再次发出查询,Client 端即可进行自动重新连接。假设您在 Client 端中启用了自动重新连接(这是mysql命令行 Client 端的默认值)。

MySQL server has gone away错误的其他一些常见原因是:

  • 您(或数据库 Management 员)已使用KILL语句或mysqladmin kill命令杀死了正在运行的线程。

  • 您尝试在关闭与服务器的连接后运行查询。这 table 明应纠正应用程序中的逻辑错误。

  • 在其他主机上运行的 Client 端应用程序没有从该主机连接到 MySQL 服务器所需的特权。

  • 您从 Client 端的 TCP/IPConnecting 收到了超时。如果您一直在使用以下命令,则可能会发生这种情况:mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...)mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...)。在这种情况下,增加超时时间可能有助于解决问题。

  • 您在服务器端遇到了超时,并且 Client 端中的自动重新连接被禁用(MYSQL结构中的reconnect标志等于 0)。

  • 您正在使用 WindowsClient 端,并且服务器在发出命令之前已断开连接(可能是因为wait_timeout已过期)。

Windows 上的问题是,在某些情况下,在写入与服务器的 TCP/IP 连接时,MySQL 不会从 os 得到错误,而是在尝试从 Connecting 读取答案时会得到错误。

解决此问题的方法是,如果自上次查询以来已经很长时间了(在连接器/ ODBC 上执行此操作),则对连接执行mysql_ping(),或者在mysqld服务器上将wait_timeout设置得很高以至于在实践中永远不会超时。

  • 如果您向服务器发送不正确或太大的查询,也会收到这些错误。如果mysqld收到的数据包太大或乱序,则认为 Client 端出了点问题,并关闭了连接。如果需要大查询(例如,如果要处理大BLOB列),则可以通过设置服务器的max_allowed_packet变量来增加查询限制,该变量的默认值为 4MB。您可能还需要增加 Client 端上的最大数据包大小。 B.4.2.9 节,“数据包太大”中提供了有关设置数据包大小的更多信息。

插入大量行的INSERTREPLACE语句也可能导致此类错误。这些语句中的任何一个都将单个请求发送到服务器,而与要插入的行数无关。因此,通常可以通过减少每个INSERTREPLACE发送的行数来避免该错误。

  • 如果主机名查找失败(例如,如果您的服务器或网络所依赖的 DNS 服务器出现故障),也可能会看到此错误。这是因为 MySQL 依赖于主机系统进行名称解析,但无法知道它是否正常工作-从 MySQL 的角度来看,该问题与其他任何网络超时都无法区分。

如果在启用了skip_networking系统变量的情况下启动 MySQL,您可能还会看到MySQL server has gone away错误。

如果您的防火墙阻止了 MySQL 端口(默认 3306),则会发生另一个可能导致此错误的网络问题,从而根本无法与 MySQL 服务器构建任何连接。

  • 您还会在派生子进程的应用程序中遇到此错误,所有应用程序都试图使用与 MySQL 服务器的相同连接。可以通过为每个子进程使用单独的连接来避免这种情况。

  • 您遇到了一个错误,该错误导致服务器在执行查询时死亡。

您可以通过执行mysqladmin version并检查服务器的正常运行时间来检查 MySQL 服务器是否死亡并重新启动。如果 Client 端连接由于mysqld崩溃并重新启动而断开,则应集中精力查找崩溃的原因。首先检查是否再次发出查询会再次杀死服务器。参见第 B.4.3.3 节“如果 MySQLcontinue 崩溃该怎么办”

通过将log_error_verbosity系统变量设置为 3 来启动mysqld,可以获取有关丢失的连接的更多信息。这会将一些断开连接消息记录在hostname.err文件中。参见第 5.4.2 节“错误日志”

如果要创建有关此问题的错误报告,请确保包含以下信息:

另请参见第 B.4.2.10 节,“通信错误和中止的连接”第 1.7 节“如何报告错误或问题”