(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)但不是解决方案.
谢谢你的帮助.
解决方法
$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.也许拉请求栏…