Rails 3.1/mysql2错误:"MySQL服务器已经消失"

Fla*_*kou 7 activerecord mysql2 ruby-on-rails-3

我在将我的rails 2.3.14/ruby​​ 1.8.7 app升级到3.1.1/1.9.2时遇到了麻烦:我有一些

(ActiveRecord::StatementInvalid) "Mysql2::Error: MySQL server has gone away"
Run Code Online (Sandbox Code Playgroud)

错误偶尔发生.重要的是要确切地说我从来没有遇到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 
Run Code Online (Sandbox Code Playgroud)

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

Mysql2::Error: Host '****' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts':...
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢你的帮助.

Fla*_*kou 12

好吧,我想我解决了我的问题.当我发布我的问题时,我没有注意到它,但似乎错误与超时有关:大约20秒后,activerecord失去了它的连接.

$ rails runner "sleep 23; puts ActiveRecord::Base.connection.active?"
=> true
$ rails runner "sleep 25; puts ActiveRecord::Base.connection.active?"
=> false
Run Code Online (Sandbox Code Playgroud)

所以我进一步挖掘,我意识到mysql和mysql2宝石没有以同样的方式处理MySQL'wait_timeout'参数:mysql gem没有设置它因此使用MySQL默认值28800,而mysql2 gem将它设置为2592000如果没有在database.yml中定义.但我的印象是值2592000超过了这个参数的最大值:2147483!这可能会导致我所描述的意外行为......

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

如果我有一些明显的随机断开而装载轨控制台(CF我的问题),我想这是因为我的应用程序花费很长的时间来加载,然后输入我的命令之前,我有时等待几秒钟.

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

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