本节还介绍了相关的Lost connection
to server during query
错误。
最常见的MySQL server has gone
away
错误原因是服务器超时并关闭了连接。在这种情况下,您通常会收到以下错误代码之一(您收到的错误代码取决于操作系统)。
错误代码 | 描述 |
---|---|
CR_SERVER_GONE_ERROR |
客户端无法向服务器发送问题。 |
CR_SERVER_LOST |
客户端在写入服务器时没有出现错误,但没有得到问题的完整答案(或任何答案)。 |
默认情况下,如果没有任何反应,服务器会在八小时后关闭连接。wait_timeout
您可以在启动mysqld时通过设置变量来更改时间限制。请参阅
第 5.1.7 节,“服务器系统变量”。
如果您有脚本,您只需再次发出查询,客户端就会自动重新连接。这假定您在客户端启用了自动重新连接(这是mysql
命令行客户端的默认设置)。
MySQL server has
gone away
该错误的
其他一些常见原因是:
KILL
您(或数据库管理员)已使用语句或mysqladmin kill命令 终止 了正在运行的线程。您尝试在关闭与服务器的连接后运行查询。这表示应更正应用程序中的逻辑错误。
在不同主机上运行的客户端应用程序没有必要的权限从该主机连接到 MySQL 服务器。
客户端的 TCP/IP 连接超时。如果您一直在使用以下命令,则可能会发生这种情况:
mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...)
或mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...)
。在这种情况下,增加超时可能有助于解决问题。您在服务器端遇到超时,并且客户端中的自动重新连接被禁用(结构中的
reconnect
标志MYSQL
等于 0)。您正在使用 Windows 客户端,并且服务器在
wait_timeout
发出命令之前已断开连接(可能是因为已过期)。Windows 上的问题是,在某些情况下,MySQL 在写入到服务器的 TCP/IP 连接时不会从操作系统收到错误,而是在尝试从连接读取答案时收到错误。
对此的解决方案是,
mysql_ping()
如果自上次查询以来已经有很长时间(这是 Connector/ODBC 所做的),或者wait_timeout
在 mysqld服务器上设置如此高以至于它在实践中永远不会超时,则在连接上执行一个操作。如果您向服务器发送不正确或太大的查询,也可能会遇到这些错误。如果 mysqld收到一个太大或乱序的数据包,它会认为客户端出了问题并关闭连接。如果您需要大查询(例如,如果您正在处理大
BLOB
列),您可以通过设置服务器变量来增加查询限制,该max_allowed_packet
变量的默认值为 4MB。您可能还需要增加客户端的最大数据包大小。有关设置数据包大小的更多信息,请参见第 B.3.2.8 节“数据包太大”.插入大量行 的
INSERT
or 语句也可能导致此类错误。REPLACE
无论要插入的行数如何,这些语句中的任何一个都会向服务器发送一个请求;因此,您通常可以通过减少每个INSERT
或 发送的行数来避免错误REPLACE
。如果主机名查找失败(例如,如果您的服务器或网络所依赖的 DNS 服务器出现故障),也可能会看到此错误。这是因为 MySQL 依赖主机系统进行名称解析,但无法知道它是否正常工作——从 MySQL 的角度来看,这个问题与任何其他网络超时都没有区别。
如果在启用系统变量 的情况下启动 MySQL, 您也可能会看到该
MySQL server has gone away
错误 。skip_networking
如果 MySQL 端口(默认 3306)被防火墙阻止,则可能会出现另一个可能导致此错误的网络问题,从而阻止与 MySQL 服务器的任何连接。
分叉子进程的应用程序也可能遇到此错误,所有子进程都尝试使用与 MySQL 服务器的相同连接。这可以通过为每个子进程使用单独的连接来避免。
您遇到了服务器在执行查询时死机的错误。
您可以通过执行mysqladmin version并检查服务器的正常运行时间来检查 MySQL 服务器是否死机并重新启动。如果因为mysqld死机重启导致客户端连接中断,则应集中精力查找死机原因。首先检查再次发出查询是否会再次终止服务器。请参阅第 B.3.3.3 节,“如果 MySQL 持续崩溃怎么办”。
您可以通过将
系统变量设置为 3 启动mysqld
来获取有关丢失连接的更多信息。这会在文件log_error_verbosity
中记录一些断开连接消息。hostname.err
请参阅
第 5.4.2 节,“错误日志”。
如果您想创建有关此问题的错误报告,请确保包含以下信息:
指示 MySQL 服务器是否已死。您可以在服务器错误日志中找到相关信息。请参阅 第 B.3.3.3 节,“如果 MySQL 持续崩溃怎么办”。
如果一个特定的查询终止了mysqld,并且在你运行查询之前检查了涉及的表
CHECK TABLE
,你能提供一个可重现的测试用例吗?参见 第 5.8 节,“调试 MySQL”。wait_timeout
MySQL服务器 中系统变量的值是 多少?(mysqladmin variables给你这个变量的值。)您是否尝试过在启用了通用查询日志的情况下运行mysqld,以确定问题查询是否出现在日志中?(参见 第 5.4.3 节,“一般查询日志”。)