• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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_timeoutmysqld服务器上设置的连接数如此之高,以至于在实践中它永远不会超时。

    • 如果您向服务器发送不正确或太大的查询,也会收到这些错误。如果mysqld收到的数据包太大或顺序混乱,则认为客户端出了点问题,并关闭了连接。如果需要大查询(例如,如果要使用大BLOB列),则可以通过设置服务器的max_allowed_packet变量来增加查询限制,该变量的默认值为64MB。您可能还需要增加客户端上的最大数据包大小。第B.4.2.9节“数据包太大”中提供了有关设置数据包大小的更多信息。。

      插入很多行的INSERTor REPLACE语句也可能导致此类错误。这些语句中的任何一个都将单个请求发送到服务器,而与要插入的行数无关。因此,通常可以通过减少每个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继续崩溃,该怎么办”。

    您可以通过将mysqldlog_error_verbosity系统变量设置为3 来获取有关丢失的连接的更多信息。这会将一些断开连接消息记录在hostname.err文件中。请参见“MySQL服务器错误日志”。

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

    • 指示MySQL服务器是否死亡。您可以在服务器错误日志中找到有关此信息。请参见第B.4.3.3节“如果MySQL继续崩溃,该怎么办”。
    • 如果特定查询杀死了mysqld并在CHECK TABLE运行查询之前检查了所涉及的表,那么您可以提供可重现的测试用例吗?请参见“调试和移植MySQL”。
    • wait_timeoutMySQL服务器中系统变量的值是什么?(mysqladmin变量为您提供此变量的值。)
    • 您是否尝试在启用通用查询日志的情况下运行mysqld以确定问题查询是否出现在日志中?(请参见“mysqldumpslow 汇总慢查询日志文件”。)

    另请参见第B.4.2.10节“通信错误和中止的连接”和“如何报告错误或问题”。


    上篇:内存不足

    下篇:数据包太大