文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


B.3.2.7 MySQL 服务器已断开

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

出现 MySQL 服务器已断开 错误的最常见原因是服务器超时并关闭了连接。在这种情况下,您通常会收到以下错误代码之一(您收到哪个错误代码取决于操作系统)。

错误代码 描述
CR_SERVER_GONE_ERROR 客户端无法向服务器发送问题。
CR_SERVER_LOST 客户端在写入服务器时没有收到错误,但它没有收到对问题的完整答案(或任何答案)。

默认情况下,如果没有任何活动,服务器会在八个小时后关闭连接。您可以通过在启动 mysqld 时设置 wait_timeout 变量来更改超时限制。请参阅 第 7.1.8 节,“服务器系统变量”

如果您有一个脚本,您只需要再次发出查询,让客户端执行自动重新连接。这假设您在客户端启用了自动重新连接(这是 mysql 命令行客户端的默认设置)。

MySQL 服务器已断开 错误的其他一些常见原因是

  • 您(或数据库管理员)使用 KILL 语句或 mysqladmin kill 命令杀死了正在运行的线程。

  • 您尝试在关闭与服务器的连接后运行查询。这表示应用程序中的逻辑错误,应予以更正。

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

  • 您在客户端遇到了 TCP/IP 连接超时。如果您一直在使用以下命令,可能会发生这种情况:mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...)mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...)。在这种情况下,增加超时可能有助于解决问题。

  • 您在服务器端遇到了超时,并且客户端的自动重新连接被禁用(MYSQL 结构中的 reconnect 标志等于 0)。

  • 您使用的是 Windows 客户端,并且服务器在发出命令之前已断开连接(可能是因为 wait_timeout 过期)。

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

    解决此问题的办法是,如果上次查询已经过去很长时间,则在连接上执行 mysql_ping()(这就是 Connector/ODBC 所做的),或者在 mysqld 服务器上设置 wait_timeout,使其实际上永远不会超时。

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

    插入大量行的 INSERTREPLACE 语句也会导致此类错误。无论要插入的行数多少,这两种语句都向服务器发送单个请求;因此,您通常可以通过减少每次 INSERTREPLACE 发送的行数来避免错误。

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

    如果 MySQL 以启用 skip_networking 系统变量的方式启动,您也可能会看到 MySQL 服务器已断开 错误。

    另一个会导致此错误的网络问题是,如果您的防火墙阻止了 MySQL 端口(默认端口 3306),从而完全阻止了与 MySQL 服务器的任何连接。

  • 在使用分叉子进程的应用程序中,您也会遇到此错误,这些子进程都试图使用相同的连接到 MySQL 服务器。可以通过为每个子进程使用单独的连接来避免这种情况。

  • 您遇到了一个错误,服务器在执行查询时崩溃了。

您可以通过执行 mysqladmin version 并检查服务器的正常运行时间来检查 MySQL 服务器是否崩溃并重新启动。如果客户端连接断开是因为 mysqld 崩溃并重新启动,您应该集中精力找出崩溃的原因。首先检查再次发出查询是否会导致服务器再次崩溃。请参阅 第 B.3.3.3 节,“如果 MySQL 不断崩溃该怎么办”

您可以通过在启动 mysqld 时将 log_error_verbosity 系统变量设置为 3 来获取有关连接丢失的更多信息。这会在 hostname.err 文件中记录一些断开连接消息。请参阅 第 7.4.2 节,“错误日志”

如果您想针对此问题创建错误报告,请确保包含以下信息

请参考 第 B.3.2.9 节, “通信错误和断开连接”,以及 第 1.6 节, “如何报告错误或问题”