免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4635 | 回复: 7
打印 上一主题 下一主题

Perl+DBI+Mysql, 出现错误“Mysql server has gone away" [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-07 21:48 |只看该作者 |倒序浏览
10可用积分
我感觉是因为idle的时间过长导致的问题。所以connection被断掉了。

可是该如何解决呢?

最佳答案

查看完整内容

$dbh->do('show status like "Up%"'); $mysql_state=$dbh->state; if($mysql_state ne ""){ print STDERR "====Warning Mysql connection has been closed,try to reconnect.....,mysql_state=#$mysql_state#===\n"; $dbh = DBI->connect("DBI:mysqlmysql_dbhost",$user,$pass) || exit(1); }

论坛徽章:
0
2 [报告]
发表于 2010-04-07 21:48 |只看该作者
能给个例子参考一下吗?谢谢

如果mysql_auto_reconnect好用的话,这个问题应该很简单了。貌似这个bug在D ...
andy820303 发表于 2010-04-07 22:48



    $dbh->do('show status like "Up%"');
    $mysql_state=$dbh->state;
    if($mysql_state ne ""{
        print STDERR "====Warning Mysql connection has been closed,try to reconnect.....,mysql_state=#$mysql_state#===\n";
        $dbh = DBI->connect("DBI:mysqlmysql_dbhost",$user,$pass) || exit(1);
    }

论坛徽章:
0
3 [报告]
发表于 2010-04-07 21:59 |只看该作者
回复 1# andy820303


    曾经遇到过,可以在执行SQL前做个判断,发现Connection不可用时重新连接一下,具体可以参考DBI的帮助信息。

论坛徽章:
0
4 [报告]
发表于 2010-04-07 22:48 |只看该作者
本帖最后由 andy820303 于 2010-04-08 00:14 编辑

能给个例子参考一下吗?谢谢

如果mysql_auto_reconnect好用的话,这个问题应该很简单了。貌似这个bug在DBD::mysql 2.9中就已经fix了,为什么新版本中还是不好用呢?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2010-04-08 07:46 |只看该作者
回复 1# andy820303


就是因为IDLE时间太长了。是可以在my.cnf里设置的:

wait_timeout=28800
interactive_timeout = 28800

具体参见这里http://dev.mysql.com/doc/refman/5.1/en/gone-away.html

我记得默认就是8小时(28800秒),网上有些人说修改之后就好了,我修改以后就没好,最后我就避开这问题了
eval { ... }
if ($@) {
   &init_db();
}
只要出现连接错误就重新连接。再后来又出了些其他问题,最后实在不想和mysql着急了,换回oracle,世界从此清静了。

论坛徽章:
0
6 [报告]
发表于 2010-04-08 09:31 |只看该作者
回复 4# py


谢谢,目前为止,我已经尝试过了wait_timeout和mysql_auto_reconnect这2种方法。都失败了

羡慕你啊,可以换成oracle,我正在写自动化测试脚本,其中需要从数据库中得到一些数据进行比较,所以换oracle是不可能了,增大wait_timeout好像也不太好,担心影响程序的正常运行。呵呵

感觉mysql_auto_reconnect应该是最简单可行的办法,可惜~~~, 着急上火阿!

论坛徽章:
0
7 [报告]
发表于 2010-04-08 10:17 |只看该作者
搜索了下, 不知道对你有没用:

主要可能是因为以下几种原因:

  一种可能是发送的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参数的作用是,用来控制其通信缓冲区的最大长度。

论坛徽章:
0
8 [报告]
发表于 2010-04-08 10:54 |只看该作者
谢谢各位,终于找到真正的原因了。

其实问题并不是因为time out,我一开始就走错路了,一直以为是因为等待的时间太长了,其实也就是几分钟的事。

正像con所说得那样,还有一种可能,就是说发送的sql语句太长了,这是我程序逻辑的问题。已经改正了。看见“mysql server has gone away",并不一定是因为time outl了

谢谢con和llz2008.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP