教程集 www.jiaochengji.com
教程集 >  数据库  >  mysql  >  正文 MySQL server has gone away问题的解决办法

MySQL server has gone away问题的解决办法

发布时间:2016-03-04   编辑:jiaochengji.com
本文介绍下,在mysql数据库中,遇到MySQL server has gone away问题,这里分享下具体的解决办法,有需要的朋友参考下吧。

本节内容:
MySQL server has gone away问题的解决方法。

问题描述:
当一个PHP脚本在请求URL时,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到MySQL时,发现MySQL的连接超时关闭了,于是就出现了“MySQL server has gone away”这样的错误提示。

解决方法1:
当然是增加你的 wait-timeout值,这个参数是在my.cnf(在Windows下台下面是my.ini)中设置,我的数据库负荷稍微大一点,所以,我设置的值 为10,(这个值的单位是秒,意思是当一个数据库连接在10秒钟内没有任何操作的话,就会强行关闭,我使用的不是永久链接 (mysql_pconnect),用的是mysql_connect,关于这个wait-timeout的效果你可以在MySQL的进程列表中看到 (show processlist) ),你可以把这个wait-timeout设置成更大,比如300秒,呵呵,一般来讲300秒足够用了,其实你也可以不用设置,MySQL默认是8个小 时。情况由你的服务器和站点来定。

方法2:
即检查 MySQL的链接状态,使其重新链接。
mysql_ping有这么一个函数,在很多资料中都说这个mysql_ping的 API会检查数据库是否链接,如果是断开的话会尝试重新连接,但在我的测试过程中发现事实并不是这样子的,是有条件的,必须要通过 mysql_options这个C API传递相关参数,让MYSQL有断开自动链接的选项(MySQL默认为不自动连接),但我测试中发现PHP的MySQL的API中并不带这个函数,你重新编辑MySQL吧,呵呵。但mysql_ping这个函数还是终于能用得上的,只是要在其中有一个小小的操作技巧:

数据库操作类中间的一个函数,如下:
 

复制代码 代码示例:
<?php
function ping(){
if(!mysql_ping($this->link)){
mysql_close($this->link); //注意:一定要先执行数据库关闭,这是关键
$this->connect();
}
}

需要调用这个函数的代码:
 

复制代码 代码示例:
<?php
$str = file_get_contents('http://www.jbxue.com');
$db->ping();//经过前面的网页抓取后,或者会导致数据库连接关闭,检查并重新连接
$db->query('select * from table');

ping()这个函数先检测数据连接是否正常,如果被关闭,整个把当前脚本的MYSQL实例关闭,再重新连接。
经 过这样处理后,可以非常有效的解决MySQL server has gone away这样的问题,而且不会对系统造成额外的开销。

解决MySQL server has gone away

1、应用程序(比如PHP)长时间的执行批量的MYSQL语句。最常见的就是采集或者新旧数据转化。
解决方案:
在my.cnf文件中添加或者修改以下两个变量:
 

wait_timeout=2880000
interactive_timeout = 2880000
 


这二个变量的具体说明可以搜索google或查看mysql手册。
如果不能修改my.cnf,则可以在连接数据库时设置CLIENT_INTERACTIVE,比如:
 

复制代码 代码示例:
sql = "set interactive_timeout=24*3600";
mysql_real_query(...)

2、执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理

解决方案:
在my.cnf文件中添加或者修改以下变量:
 

max_allowed_packet = 10M(也可以设置自己需要的大小)
max_allowed_packet参数的作用是,用来控制其通信缓冲区的最大长度。

1、应用程序(比如PHP)长时间的执行批量的MYSQL语句。
最常见的就是采集或者新旧数据转化。

解决方案:
在my.ini文件中添加或者修改以下两个变量:
 

wait_timeout=2880000
interactive_timeout = 2880000

关于两个变量的用法,请查看mysql手册中的相关说明吧。
如果不能修改my.cnf,则可以在连接数据库时设置CLIENT_INTERACTIVE,比如:
 

复制代码 代码示例:
sql = "set interactive_timeout=24*3600";
mysql_real_query(...)

2、执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。
比如,图片数据的处理

解决方法,在my.cnf文件中添加或者修改以下变量:
max_allowed_packet = 10M (也可以设置自己需要的大小)
max_allowed_packet 参数的作用是,用来控制其通信缓冲区的最大长度。

附,网络上的一些相关问题与解决方法
解决MySQL server has gone away 的问题:
错误提示:MySQL server has gone away。
大概浏览了一下,主要可能是因为以下几种原因:
一种可能是发送的SQL语句太长,以致超过了max_allowed_packet的大小,如果是这种原因,你只要修改my.cnf,加大max_allowed_packet的值即可。
还有一种可能是因为某些原因导致超时,比如说程序中获取数据库连接时采用了Singleton的做法,虽然多次连接数据库,但其实使用的都是同一个连接,而且程序中某两次操作数据库的间隔时间超过了wait_timeout(SHOW STATUS能看到此设置),那么就可能出现问题。最简单的处理方式就是把wait_timeout改大,当然你也可以在程序里时不时顺手mysql_ping()一下,这样MySQL就知道它不是一个人在战斗。
解决MySQL server has gone away

1、应用程序(比如PHP)长时间的执行批量的MYSQL语句。最常见的就是采集或者新旧数据转化。

解决方案:
在my.cnf文件中添加或修改以下两个变量:
 

复制代码 代码示例:
wait_timeout=2880000
interactive_timeout = 2880000  

关于两个变量的具体说明可以google或者看官方手册。
如果不能修改my.cnf,则可以在连接数据库时设置CLIENT_INTERACTIVE,比如:
 

复制代码 代码示例:
sql = "set interactive_timeout=24*3600";
mysql_real_query(...)

2、执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理
解决方案:
在my.cnf文件中添加或者修改以下变量:
max_allowed_packet = 10M
(也可以设置自己需要的大小)

max_allowed_packet
参数的作用是,用来控制其通信缓冲区的最大长度

MySQL: 诡异的MySQL server has gone away及其解决

在Mysql执行show status,通常更关注缓存效果、进程数等,往往忽略了两个值:
 

Variable_name Value
Aborted_clients 3792
Aborted_connects 376

通常只占query的0.0x%,所以并不为人所重视。而且在传统Web应用上,query错误对用户而言影响并不大,只是重新刷新一下页面就OK了。最近的基础改造中,把很多应用作为service运行,无法提示用户重新刷新,这种情况下,可能就会影响到服务的品质。

您可能感兴趣的文章:
mysql提示MySQL server has gone away导入时报错2006错误
mysql 导入数据报2006错误的解决方法
有关mysql server has gone away报错的原因分析
mysql server has gone away报错原因的分析
mysql server has gone away的解决方法
MySQL server has gone away问题的解决办法
解决ERROR 2006 (HY000) at line XX: MySQL server has gone away问题
mysql报General error 2006 MySQL server has gone away...错误解决方法
MySQL导入数据库时报错,MySQL server has go away
mysql默认字符编码问题

关键词: mysql gone away   
[关闭]
~ ~