# B.3.2.7 MySQL 服务器已消失

本节还涵盖了相关的查询期间失去与服务器的连接错误。

最常见的原因MySQL 服务器已经消失错误是服务器超时并关闭了连接。在这种情况下,您通常会收到以下错误代码之一(您收到的错误代码取决于操作系统)。

错误代码 描述
CR_SERVER_GONE_ERROR (opens new window) 客户端无法向服务器发送问题。
CR_SERVER_LOST (opens new window) 客户端在写入服务器时没有收到错误,但它没有得到问题的完整答案(或任何答案)。

默认情况下,如果没有发生任何事情,服务器会在八小时后关闭连接。您可以通过设置更改时间限制等待超时开始时的变量mysqld.看第 5.1.8 节,“服务器系统变量”.

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

其他一些常见的原因MySQL 服务器已经消失错误是:

  • 您(或数据库管理员)已经用 a 杀死了正在运行的线程声明或mysqladmin 杀命令。

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

  • 在不同主机上运行的客户端应用程序没有从该主机连接到 MySQL 服务器的必要权限。

  • 您从客户端的 TCP/IP 连接超时。如果您一直在使用以下命令,则可能会发生这种情况:mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...) (opens new window)要么mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...) (opens new window).在这种情况下,增加超时可能有助于解决问题。

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

  • 您正在使用 Windows 客户端并且服务器已断开连接(可能是因为等待超时expired) 在命令发出之前。

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

    解决方案是要么做一个mysql_ping() (opens new window)如果自上次查询以来已经很长时间(这是连接器/ODBC 所做的)或设置,则在连接上等待超时mysqld服务器如此之高,以至于实际上它永远不会超时。

  • 如果您向服务器发送不正确或太大的查询,您也可能会收到这些错误。如果mysqld接收到一个太大或无序的数据包,它假定客户端出现问题并关闭连接。如果您需要大查询(例如,如果您正在使用大斑点列),您可以通过设置服务器的max_allowed_pa​​cket变量,默认值为 64MB。您可能还需要增加客户端的最大数据包大小。有关设置数据包大小的更多信息,请参见第 B.3.2.8 节,“数据包太大”.

    一个插入要么代替插入大量行的语句也可能导致此类错误。无论要插入的行数如何,这些语句中的任何一个都向服务器发送单个请求;因此,您通常可以通过减少每次发送的行数来避免错误插入要么代替.

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

    您可能还会看到MySQL 服务器已经消失如果MySQL是用跳过网络系统变量已启用。

    如果MySQL端口(默认值3306)被防火墙阻止,则会出现另一个可能导致此错误的网络问题,从而阻止与MySQL服务器的任何连接。

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

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

    您可以通过执行以下命令来检查MySQL服务器是否死机并重新启动mysqladmin版本检查服务器的正常运行时间。如果客户端连接因以下原因而中断mysqld崩溃并重新启动后,您应该集中精力查找崩溃的原因。首先检查是否再次发出查询会再次终止服务器。看见B.3.3.3节,“如果MySQL持续崩溃,该怎么办”.

    您可以通过启动获取有关断开连接的更多信息mysqld日志错误详细系统变量设置为3。这会将一些断开连接的消息记录在主机名。犯错误文件看见第5.4.2节“错误日志”.

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

  • 指示MySQL服务器是否已死亡。您可以在服务器错误日志中找到相关信息。看见B.3.3.3节,“如果MySQL持续崩溃,该怎么办”.

  • 如果一个特定的查询失败mysqld相关表格已与检查表在运行查询之前,您能提供一个可复制的测试用例吗?看见第5.9节,“调试MySQL”.

  • 这本书的价值是什么等等,暂停MySQL服务器中的系统变量?(mysqladmin变量提供此变量的值。)

  • 你试过跑步吗mysqld启用常规查询日志以确定问题查询是否出现在日志中?(见第5.4.3节,“一般查询日志”.)

    另见第B.3.2.9节,“通信错误和中断的连接”第1.6节,“如何报告错误或问题”.