MySQL server has gone away的几种解决办法

注:本文由ldlo860708译自http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

由于本人水平有限,有些地方会比较糟糕,希望广大ITer在阅读时候不吝赐教。

"MySQL server has gone away"错误最常见的原因是服务超时并且连接被关闭了。这种情况下,你通常可以得到下面这样的错误代码(这个错误不依赖于操作系统)。

错误代码

描述

CR_SERVER_GONE_ERROR

客户端不能将请求发送到服务器。

CR_SERVER_LOST

客户端在写服务器期间正常,但是没有得到相应请求的完整的应答或没有得到应答。

默认情况下,服务器在没有任何事情发生的8小时之后会关闭连接。你可以在启动mysqld的时候通过设置wait_timeout这个变量来改变时间限制。如果你使用脚本,你必须为客户端重新发送查询来获得自动的重新连接。这意味着你在客户端的自动重新连接可以使用(对于mysql命令行来说是默认的)。

对于“MySQL server has gone away”错误还有其他的几个原因:

当前用户(或者数据库管理员)使用KILL命令或者mysqladmin kill命令杀死了正在运行的(mysql)进程。

 你试图在关闭服务器连接之后进行查询。这意味着应用程序的逻辑错误应该被更正。

在不同主机上运行的客户端应用程序没有连接MySQL服务器必要的权限。

客户端的TCP/IP连接超时了。如果你已使用mysql_options..., MYSQL_OPT_READ_TIMEOUT)或者mysql_options..., MYSQL_OPT_WRITE_TIMEOUT, ...)命令,这种情况是有可能发生的。这种情况下增加timeout可以解决这个问题。

你在服务器端遇到超时并且客户端的自动重连失效了(MySQL结构中的reconnect标志为0)。

服务器在Windows客户端的命令发送之前已经放弃了连接(也许这是因为wait_timeout过期了)。

Windows的这个问题是由于在某些情况下,MySQL没有从OS得到请求TCP/IP连接到服务器的错误,而是在重连接读取相应的时候获得了错误。

     之前的MySQL 5.0.19,即使在MySQL结构中的reconnenct标志等于1的时候,MySQL不会自动重连以及重新发送请求因为它不知道服务器是否获得了原来的查询。

 解决方案有:如果距上次查询时间很长,可以在上次连接上做一个mysql_ping();或者在mysqld服务器设置wait_timeout足够长以致它不会超时。

 如果你向服务器发送错误或者很大的请求你也可能会得到这样的错误。如果mysqld接收一个很大或者无序的包,它意味着客户端发生了错误并且关闭了连接。如果你需要大量的请求(例如,如果你在操作BLOB栏),你可以通过设置服务器的max_allowed_packet变量来增加查询限制,这个值默认情况下为1MB。你也可能需要在客户端增加最大包长。

一个插入大量行的INSERT命令或者REPLACE命令也会导致大量错误。不论多少行需要被插入,这两个命令给服务器只发送一个请求。因此,减少在每次INSERT或者REPLACE时操作行数常常会避免这个错误。

 如果你的客户端旧于4.0.8并且你的服务器是4.0.8或者以上,如果你发送一个16MB或者更大的包,你将会失去连接。

 如果主机名查找失败(例如,你的服务器或者网络依赖的DNS服务器坏了)你也可能会看到这个错误。这是因为MySQL在主机系统上独立于域名解析,但是你没有办法知道它是否在工作——MySQL认为这个问题与其他的网络延时没什么区别。

如果MySQL--skip-networking选项被启动,你有可能见到MySQL server has gone away的错误。

另外一个可能导致错误发生的网络问题是MySQL端口被防火墙阻挡了,发到MySQL服务器的所有连接都会被阻止。

当应用程序产生子进程时候,这些子进程试图使用MySQL服务器的同一个的连接,这种情况下你也可能会遇到这个错误。

服务器在执行查询的时候死机会让你遇到这个错误。

你可以检查MySQL服务器是否死机,并且通过执行mysqladmin version和检查服务器的运行时间来重服务器。如果客户端的连接由于mysqld的崩溃和重启而失去,你应该集中注意力来查找崩溃的原因。检查是否再次发生查询会再次杀死服务器。

通过启动mysqld--log-warnings=2选项,你可以获得关于失去连接的更多信息。它将把失去连接的错误记录到hostname.err文件里面。

你可以在服务器错误日志里面找到MySQL服务器是否死亡的信息。

 如果一个特定的查询杀死了mysqld,并且在你运行查询之前表被CHECK TABLE检查了,你能提供一个可重复测试的方案么?

 MySQL服务器的系统变量——wait_timeout的值是多少?

  你尝试了使用正常的查询记录开关运行mysqld来决定查询的问题是否出现在这个记录中吗?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值