子分类
  • 无子分类
MySQL 错误 2013 Lost connection to MySQL server during query
  • 2014-07-21发布
  • 2014-07-21修改

前题:在mysql-proxy读写分离环境中, Lost connection to MySQL server during query( 2013 )出现的可能原因分析。近期发现在未经本人授权的情况下,某些网站转载了本人的文章,在此说明一下本文原创于php_sir,原文地址:http://blog.sina.com.cn/s/blog_5f66526e0100t8hj.html,希望转载时保留此信息。

 

问题描述:

(mysql中文手册)18.2.1 MySQL server has gone away错误

本小节也涉及有关Lost connection to server during query的错误。

对MySQL server has gone away错误最常见的原因是服务器超时了并且关闭了连接。缺省地,如果没有事情发生,服务器在 8个小时(28800秒)后关闭连接。你可在启动mysqld时通过设置wait_timeout变量改变时间限制。

你可以通过执行mysqladmin version并且检验正常运行的时间来检查MySQL还没死掉。

如果你有一个脚本,你只须再发出查询让客护进行一次自动的重新连接。

在这种请下,你通常能获得下列错误代码(你得到的是OS相关的): CR_SERVER_GONE_ERROR  客户不能发送一个问题给服务器。 
CR_SERVER_LOST  当写服务器时,客户没有出错,但是它没有得到对问题的一个完整的答案(或任何答案)。 


如果你向服务器发送不正确的或太大的查询,你也可能得到这些错误。如果mysqld得到一个太大或不正常的包,它认为客户出错了并关闭连接。如果你需要较大的查询(例如,如果你正在处理较大的BLOB列),你可以使用-O max_allowed_packet=#选项(缺省1M)启动mysqld以增加查询限制。多余的内存按需分配,这样mysqld只有在你发出较大差询时或mysqld必须返回较大的结果行时,才使用更多的内存!

 

================================================

修改wait_timeout 的值
更改方法,需同时更改如下2个参数(单位--秒):

wait_timeout=86400
interactive_timeout=86400 

 


参数意义如下-------------------------------------:
MySQL服务器不可用

在本节中,还介绍了出现查询错误期间,与丢失了服务器连接有关的事宜。

MySQL服务器不可用错误的最常见原因是服务器超时以及连接已关闭。在该情况下,通常能见到下述错误代码之一(具体的错误代码与操作系统有关):

错误代码
 描述
 
CR_SERVER_GONE_ERROR
 客户端无法将问题发送至服务器。
 
CR_SERVER_LOST
 写入服务器时客户端未收到错误,但也未获得问题的完整答案(或任何答案)。
 


在默认情况下,如果未发生任何事,8小时后服务器将关闭连接。也可以在启动mysqld时,通过设置wait_timeout变量更改时间限制。

 

interactive_timeout:
服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。又见wait_timeout。

wait_timeout:

服务器关闭非交互连接之前等待活动的秒数。

在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。又见interactive_timeout。
=====================================================

 

三个层面上解决这个问题:

1. 代码层面,你需要在自己的PHP数据库连接处增加大致如下代码。

if(   in_array(mysql_errno(), array(2006, 2013))){

         mysql_close();

         mysql_connect(...);

        mysql_query(...);

}

也就是说遇到2006,2013错误就重新连接一下MySQL。

2. MySQL层面,需要配置一些参数 my.cnf

wait_timeout = x 超时时间  如600秒

max_allowed_packet = y 最大允许数据量

适当增加x,y的值。

3. 一般出现这种情况不是所有例句而是单个表,请你先修复表一般都能解决这类问题。