ruby-on-rails-3 – Rails 3.1 / mysql2错误:“MySQL服务器已经消失”

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – Rails 3.1 / mysql2错误:“MySQL服务器已经消失”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在将我的rails 2.3.14 / ruby​​ 1.8.7 app升级到3.1.1 / 1.9.2时遇到了麻烦:我有一些
(ActiveRecord::StatementInvalid) "MysqL2::Error: MysqL server has gone away"

错误偶尔发生.重要的是要确保我在2.3.14上的’MysqL’gem和完全相同的db(因为bug不应该来自MysqL(v5.5.10))从来没有遇到过这样的问题.

示例:

$rails c production
Loading production environment (Rails 3.1.1)
ruby-1.9.2-p290 :001 > ActiveRecord::Base.connection.active?
 => false
ruby-1.9.2-p290 :002 > exit
$rails c production
Loading production environment (Rails 3.1.1)
ruby-1.9.2-p290 :001 > ActiveRecord::Base.connection.active?
 => true

这只发生在我的(远程)生产数据库中,本地开发数据库没问题.我试图在我的database.yml中设置“reconnect:true”,但它导致了一个

MysqL2::Error: Host '****' is blocked because of many connection errors; unblock with 'MysqLadmin flush-hosts':...

我试图用一个小的rb脚本来解决这个问题,只加载MysqL2和activerecord,但我没有设法重现这种方式的bug(所以它可能链接到rails堆栈).

由于编码问题(http://www.rorra.com.ar/2010/07/30/rails-3-mysql-and-utf-8/),我无法从’MysqL2’回到’MysqL’gem.因此,我不得不将我的作品回滚到我的rails 2.3.14应用程序,这让我非常伤心……

你看到我能做些什么来调试这个?我甚至找不到重现错误的可靠方法……有没有人遇到过同样的错误

我刚发现很少有人提到这个bug(例如:https://github.com/brianmario/mysql2/issues/213)但不是解决方案.

谢谢你的帮助.

解决方法

好吧,我想我解决了我的问题.当我发布我的问题时,我没有注意到它,但似乎错误与超时有关:大约20秒后,activerecord失去了它的连接.
$rails runner "sleep 23; puts ActiveRecord::Base.connection.active?"
=> true
$rails runner "sleep 25; puts ActiveRecord::Base.connection.active?"
=> false

所以我进一步挖掘,我意识到MysqLMysqL2 gems没有以同样的方式处理MysqL’wait_timeout’参数:MysqL gem没有设置它因此使用MySQL default value 28800,而mysql2 gem sets it at 2592000如果没有在database.yml中定义.
但我的印象是2592000的值超过了这个参数的最大值:2147483!这可能会导致我所描述的意外行为……

我构建了一个显示错误的脚本测试:https://gist.github.com/1514154

如果我在加载rails控制台时有一些明显的随机断开连接(请参阅我的问题),我认为这是因为我的应用程序需要很长时间才能加载,而我有时会在输入命令之前等待几秒钟.

我无法解释为什么我们很少遇到这个问题.也许它特定于我的conf(远程数据库,MysqL版本?).我尝试过另一个远程登台数据库错误没有重现……

所以作为结论,我将在我的database.yml中设置wait_timeout:2147483.也许拉请求栏…

原文链接:https://www.f2er.com/ruby/269170.html

猜你在找的Ruby相关文章