#### B.3.2.7 MySQL 服务器已消失

[](<>)[](<>)

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

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

| 错误代码 | 描述 |
| ---- | --- |
| [`CR_SERVER_GONE_ERROR`](https://dev.mysql.com/doc/mysql-errors/8.0/en/client-error-reference.html#error_cr_server_gone_error) | 客户端无法向服务器发送问题。 |
| [`CR_SERVER_LOST`](https://dev.mysql.com/doc/mysql-errors/8.0/en/client-error-reference.html#error_cr_server_lost) | 客户端在写入服务器时没有收到错误，但它没有得到问题的完整答案（或任何答案）。 |

默认情况下，如果没有发生任何事情，服务器会在八小时后关闭连接。您可以通过设置更改时间限制[`等待超时`](server-system-variables.html#sysvar_wait_timeout)开始时的变量[**mysqld**](mysqld.html).看[第 5.1.8 节，“服务器系统变量”](server-system-variables.html).

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

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

-   您（或数据库管理员）已经用 a 杀死了正在运行的线程[`杀`](kill.html)声明或[**mysqladmin 杀**](mysqladmin.html)命令。

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

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

-   您从客户端的 TCP/IP 连接超时。如果您一直在使用以下命令，则可能会发生这种情况：[`mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...)`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html)要么[`mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...)`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html).在这种情况下，增加超时可能有助于解决问题。

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

-   您正在使用 Windows 客户端并且服务器已断开连接（可能是因为[`等待超时`](server-system-variables.html#sysvar_wait_timeout)expired) 在命令发出之前。

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

    解决方案是要么做一个[`mysql_ping()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-ping.html)如果自上次查询以来已经很长时间（这是连接器/ODBC 所做的）或设置，则在连接上[`等待超时`](server-system-variables.html#sysvar_wait_timeout)在[**mysqld**](mysqld.html)服务器如此之高，以至于实际上它永远不会超时。

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

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

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

    您可能还会看到`MySQL 服务器已经消失`如果MySQL是用[`跳过网络`](server-system-variables.html#sysvar_skip_networking)系统变量已启用。

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

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

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

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

    您可以通过启动获取有关断开连接的更多信息[**mysqld**](mysqld.html)和[`日志错误详细`](server-system-variables.html#sysvar_log_error_verbosity)系统变量设置为3。这会将一些断开连接的消息记录在`主机名。犯错误`文件看见[第5.4.2节“错误日志”](error-log.html).

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

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

-   如果一个特定的查询失败[**mysqld**](mysqld.html)相关表格已与[`检查表`](check-table.html)在运行查询之前，您能提供一个可复制的测试用例吗？看见[第5.9节，“调试MySQL”](debugging-mysql.html).

-   这本书的价值是什么[`等等，暂停`](server-system-variables.html#sysvar_wait_timeout)MySQL服务器中的系统变量？([**mysqladmin变量**](mysqladmin.html)提供此变量的值。）

-   你试过跑步吗[**mysqld**](mysqld.html)启用常规查询日志以确定问题查询是否出现在日志中？（见[第5.4.3节，“一般查询日志”](query-log.html).)

    另见[第B.3.2.9节，“通信错误和中断的连接”](communication-errors.html)和[第1.6节，“如何报告错误或问题”](bug-reports.html).
