MySQL服务器不见了
本节还介绍了相关的Lost connection to server during query
错误。
该MySQL server has gone away
错误的最常见原因是服务器超时并关闭了连接。在这种情况下,您通常会获得以下错误代码之一(所获得的错误代码取决于操作系统)。
错误代码 | 描述 |
---|---|
CR_SERVER_GONE_ERROR | 客户端无法向服务器发送问题。 |
CR_SERVER_LOST | 客户端在写入服务器时没有收到错误,但是没有得到问题的完整答案(或任何答案)。 |
默认情况下,如果什么都没发生,服务器将在八小时后关闭连接。您可以wait_timeout
在启动mysqld时通过设置变量来更改时间限制。请参见“服务器系统变量”。
如果有脚本,则只需再次发出查询,客户端即可进行自动重新连接。假设您在客户端中启用了自动重新连接(这是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上的问题是,在某些情况下,在写入与服务器的TCP / IP连接时,MySQL不会从操作系统得到错误,而是在尝试从连接中读取答案时会得到错误。
解决此问题的方法是,
mysql_ping()
如果自上一次查询以来已经过了很长时间(这是Connector / ODBC所做的事情),则对连接进行连接,或者wait_timeout
在mysqld服务器上设置的连接数如此之高,以至于在实践中它永远不会超时。如果您向服务器发送不正确或太大的查询,也会收到这些错误。如果mysqld收到的数据包太大或顺序混乱,则认为客户端出了点问题,并关闭了连接。如果需要大查询(例如,如果要使用大
BLOB
列),则可以通过设置服务器的max_allowed_packet
变量来增加查询限制,该变量的默认值为64MB。您可能还需要增加客户端上的最大数据包大小。第B.4.2.9节“数据包太大”中提供了有关设置数据包大小的更多信息。。插入很多行的
INSERT
orREPLACE
语句也可能导致此类错误。这些语句中的任何一个都将单个请求发送到服务器,而与要插入的行数无关。因此,通常可以通过减少每个INSERT
或发送的行数来避免该错误REPLACE
。如果主机名查找失败(例如,如果您的服务器或网络所依赖的DNS服务器出现故障),也可能会看到此错误。这是因为MySQL依赖于主机系统进行名称解析,但是无法知道它是否正常工作-从MySQL的角度来看,该问题与其他任何网络超时都无法区分。
MySQL server has gone away
如果在skip_networking
启用系统变量的情况下启动MySQL,您可能还会看到错误。如果您的防火墙阻止了MySQL端口(默认3306),则会发生另一个可能导致此错误的网络问题,从而根本无法与MySQL服务器建立任何连接。
- 您还会在派生子进程的应用程序中遇到此错误,所有应用程序都试图使用与MySQL服务器的相同连接。可以通过为每个子进程使用单独的连接来避免这种情况。
- 您遇到了一个错误,该错误导致服务器在执行查询时死亡。
您可以通过执行mysqladmin版本并检查服务器的正常运行时间来检查MySQL服务器是否死亡并重新启动。如果客户端连接由于mysqld崩溃并重新启动而中断,则应集中精力查找崩溃的原因。首先检查是否再次发出查询会再次杀死服务器。请参见第B.4.3.3节“如果MySQL继续崩溃,该怎么办”。
您可以通过将mysqld的log_error_verbosity
系统变量设置为3 来获取有关丢失的连接的更多信息。这会将一些断开连接消息记录在hostname.err
文件中。请参见“MySQL服务器错误日志”。
如果要创建有关此问题的错误报告,请确保包含以下信息:
- 指示MySQL服务器是否死亡。您可以在服务器错误日志中找到有关此信息。请参见第B.4.3.3节“如果MySQL继续崩溃,该怎么办”。
- 如果特定查询杀死了mysqld并在
CHECK TABLE
运行查询之前检查了所涉及的表,那么您可以提供可重现的测试用例吗?请参见“调试和移植MySQL”。 wait_timeout
MySQL服务器中系统变量的值是什么?(mysqladmin变量为您提供此变量的值。)- 您是否尝试在启用通用查询日志的情况下运行mysqld以确定问题查询是否出现在日志中?(请参见“mysqldumpslow 汇总慢查询日志文件”。)
另请参见第B.4.2.10节“通信错误和中止的连接”和“如何报告错误或问题”。