MySQL server has gone away 的原因分析
MySQL服务器消失的最常见原因是服务器超时并关闭了连接。在这种情况下,您通常会得到以下错误代码之一(您获得的错误代码与操作系统相关)。
默认情况下,如果没有发生任何事情,服务器会在八小时后关闭连接。您可以通过在启动mysqld时设置wait_timeout变量来更改时间限制。
如果您有脚本,则只需再次发出查询,客户端就可以自动重新连接。这假设您在启用的客户端中具有自动重新连接(这是mysql命令行客户端的默认设置)。
MySQL服务器消失的一些其他常见原因是:
1、您(或数据库管理员)已使用KILL语句或mysqladmin kill命令终止正在运行的线程。
2、您尝试在关闭与服务器的连接后运行查询。这表示应该更正的应用程序中存在逻辑错误。
3、在不同主机上运行的客户端应用程序没有从该主机连接到MySQL服务器的必要权限。
4、您从客户端的TCP / IP连接获得超时。如果您一直在使用以下命令,则可能会发生这种情况:mysql_options(...,MYSQL_OPT_READ_TIMEOUT,...)或mysql_options(...,MYSQL_OPT_WRITE_TIMEOUT,...)。在这种情况下,增加超时可能有助于解决问题
5、您在服务器端遇到超时,并且客户端中的自动重新连接被禁用(MYSQL结构中的重新连接标志等于0)。
6、您正在使用Windows客户端,并且在发出命令之前服务器已断开连接(可能是因为wait_timeout已过期)。Windows上的问题是,在某些情况下,MySQL在写入到服务器的TCP / IP连接时不会从操作系统中获得错误,而是在尝试从连接中读取答案时收到错误。
7、如果向服务器发送不正确或太大的查询,也可能会出现这些错误。如果mysqld收到的数据包太大或无序,则会假定客户端出现问题并关闭连接。如果需要大查询(例如,如果使用大型BLOB列),可以通过设置服务器的max_allowed_packet变量来增加查询限制,该变量的默认值为64MB。您可能还需要增加客户端的最大数据包大小。
插入大量行的INSERT或REPLACE语句也可能导致这些类型的错误。这些语句中的任何一个都向服务器发送单个请求,而不管要插入的行数是多少;因此,您通常可以通过减少每个INSERT或REPLACE发送的行数来避免错误。
8、如果主机名查找失败(例如,如果您的服务器或网络所依赖的DNS服务器发生故障),也可能会看到此错误。这是因为MySQL依赖于主机系统进行名称解析,但无法知道它是否正常工作 - 从MySQL的角度来看,问题与任何其他网络超时无法区分。
如果使用--skip-networking选项启动MySQL,您可能还会看到MySQL服务器已经消失。
如果MySQL端口(默认3306)被防火墙阻止,则可能导致此错误的另一个网络问题,从而阻止任何连接到MySQL服务器。
9、您也可以使用fork子进程的应用程序遇到此错误,所有这些进程都尝试使用与MySQL服务器相同的连接。通过为每个子进程使用单独的连接可以避免这种情况。
10、您遇到了执行查询时服务器死机的错误。
您可以通过执行mysqladmin版本并检查服务器的正常运行时间来检查MySQL服务器是否已死亡并重新启动。如果因为mysqld崩溃并重新启动而导致客户端连接中断,则应集中精力查找崩溃的原因。首先检查是否再次发出查询会再次杀死服务器。
如果要创建有关此问题的错误报告,请确保包含以下信息:
1、指示MySQL服务器是否已死亡。您可以在服务器错误日志中找到有关此内容的信息。
2、如果特定查询杀死mysqld并且在运行查询之前使用CHECK TABLE检查了所涉及的表,那么您是否可以提供可重现的测试用例?
3、MySQL服务器中wait_timeout系统变量的值是多少?(mysqladmin变量为您提供此变量的值。)您是否尝试在启用常规查询日志的情况下运行mysqld以确定问题查询是否出现在日志中?
以上翻译自mysql官方文档