Rails 3.1.0和Resque - “Mysql2 ::错误:MySQL服务器已经消失”

Rails 3.1.0和Resque - “Mysql2 ::错误:MySQL服务器已经消失”

问题描述:

帮助!随时都会出现“MySQL服务器已经消失”的错误。同一名工人有时会跑,然后再以这种方式崩溃。我似乎无法找到一种疯狂的模式。Rails 3.1.0和Resque - “Mysql2 ::错误:MySQL服务器已经消失”

我曾尝试以下解决方案:

ActiveRecord::Base.verify_active_connections! 
在我的每一个任务执行方法

,按照该resque faq

我自己也尝试这样的代码:

adapter = ActiveRecord::Base.configurations[Rails.env]['adapter'] 

if adapter == "mysql2" 
module ActiveRecord::ConnectionAdapters 
    class Mysql2Adapter 
    alias_method :execute_without_retry, :execute 

    def execute(*args) 
     execute_without_retry(*args) 
    rescue ActiveRecord::StatementInvalid => e 
     if e.message =~ /server has gone away/i 
     warn "Server timed out, retrying" 
     reconnect! 
     retry 
     else 
     raise e 
     end 
    end 
    end 
end 
end 
在初始化

,为per code by a Resque developer,用在计算器上和其他地方发现了一些修改。

我也尝试了上述两个在一起。结果是一样的。

我也尝试在我的database.yml中设置wait_timeout: 2147483根据this StackOverflow post无济于事。

我使用:

  • 轨3.1.0
  • resque 1.20.0
  • resque调度1.9.9
  • mysql2 0.3.11

一切正在运行在Mac上使用RVM/Homebrew/Passenger。 mysql数据库对我的机器是本地的。

这是一个错误的例子:

Mysql2::Error: MySQL server has gone away: SHOW FIELDS FROM `m_variables` 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:283:in `query' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:283:in `block in execute' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract_adapter.rb:244:in `block in log' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.1.0/lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract_adapter.rb:239:in `log' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:283:in `execute' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:473:in `columns' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:95:in `block (2 levels) in initialize' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:185:in `with_connection' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:92:in `block in initialize' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:106:in `yield' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:106:in `default' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:106:in `block in initialize' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/base.rb:711:in `yield' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/base.rb:711:in `default' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/base.rb:711:in `columns_hash' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/locking/optimistic.rb:145:in `locking_enabled?' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/relation.rb:110:in `to_a' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/relation/finder_methods.rb:155:in `all' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/base.rb:441:in `all' 
/Users/fdot/Sites/mq/app/workers/m_variable_type_assigner.rb:25:in `perform' 

,这里是另一个例子:

Mysql2::Error: MySQL server has gone away: SELECT `users`.* FROM `users` 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:687:in `query' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:687:in `block in exec_query' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract_adapter.rb:244:in `block in log' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.1.0/lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract_adapter.rb:239:in `log' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:685:in `exec_query' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/mysql2_adapter.rb:679:in `select' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/database_statements.rb:18:in `select_all' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/query_cache.rb:63:in `select_all' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/base.rb:470:in `find_by_sql' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/relation.rb:111:in `to_a' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/relation/finder_methods.rb:155:in `all' 
/Users/fdot/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.0/lib/active_record/base.rb:441:in `all' 
/Users/fdot/Sites/mq/app/workers/transient_user_cleaner.rb:21:in `perform' 

我不知所措就在这里。非常感谢帮助!

发生这种情况时,有太多的连接,哪些mysql无法处理。

尝试限制您正在进行的连接和处理的数量。不要并行运行,请连续发出一些请求。

这更是一个MySQL错误的,而不是你的语言或框架的错误:看到here更多细节

+0

不,这是Resque和MySQL的通病。 Resque不会重新连接... – rrauenza 2014-06-12 16:02:13