加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 04:30:31 所属栏目:百科 来源:网络整理
导读:我在将我的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不应
我在将我的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

所以我进一步挖掘,我意识到mysql和mysql2 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.也许拉请求栏…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读