MySQL server has gone away问题及其解决
发布于 2008-06-16 20:06 阅读:27602 评论:1 标签: away MySQL

    初看这个提示,你可能会发笑,这个mysql的提示真是人性化呢。很快你就会笑不出来了,因为,问题是需要用来解决的。

    看上去,应该是两次mysql操作之间的时间太长了,导致mysql连接自动关闭了。可是根据经验,对同一批数据,此前程序也这么写过,两次操作的时间也同样很长。更何况,同事也同时在操作这个库,间隔的时间比我的更长。

    看了mysql服务器端的wait_timeout和max_allowed_packet的值,绝对的长和大!如下:

以下是代码片段:
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
1 row in set (0.00 sec)

   看着这些数据,感觉可以判断出服务器端应该是没有问题的,但是总得用实验说话,编写如下程序:

以下是代码片段:
$link = mysql_connect('...', '...', '...');
mysql_select_db("...", $link);

echo "Start !\n";

sleep(30);

echo "End !\n";

mysql_close($link);
?>

    执行之后,到mysql服务器端show processlist;发现一超过20秒,就没有其连接了。然而再到另一台服务器上执行,却无此问题。top命令了一下,发现两台服务器的空闲内存的确差异很大。而上面又说明了,同事和我在同一服务器上对这个库进行操作却无此问题,真令人诧异。

    而后又发现,我程序有个bug,有一数字变量本意是存储sql语句的记录,然而并没有考虑这个数组在执行时间好几个小时之后的大小会成为天文数字。莫非这个地方有问题?

   既然暂时可以排除服务器的问题,只好从我的程序入手了。

   mysql_ping()是个好东西,但用得也不是很爽。手册中“If it has gone down, an automatic reconnection is attempted. ”。但是,发现它并没有automatic reconnection。

   于是只好,先判断mysql_ping()的返回值,如果false,则mysql_close()本次连接,然后mysql_connect()。

    如果是在类里面实现的话,建议加上mysql_connect()第四的参数为true。这样在实例化的时候避免资源符号只有一个。

    参考资料:

以下是引用片段:
MySQL: 诡异的MySQL server has gone away及其解决
http://www.jimmydong.com/blog/post/1/123

MySQL server has gone away
http://hi.baidu.com/thinkinginlamp/blog/item/8512ad4b6f2e96f482025cf7.html

B.1.2.9. MySQL server has gone away
http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

MySQL server has gone away 解决办法
http://yytcpt.blueidea.com/archives/2007/4280.shtml

mysql_ping
http://cn2.php.net/mysql_ping

我也遇到这个问题

正在参照您的方法进行解决.谢谢分享.

by 久久乡情 2008-11-22 15:16:18