# 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_packet
变量,默认值为 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节,“一般查询日志”.)