【问题标题】:Rails 3.1.0 and Resque -- "Mysql2::Error: MySQL server has gone away"Rails 3.1.0 和 Resque——“Mysql2::Error: MySQL server has gone away”
【发布时间】:2012-02-25 16:25:36
【问题描述】:

帮助!我总是在看似随机的时间收到“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,在 StackOverflow 和其他地方发现了一些修改。

我也同时尝试了以上两种方法。结果是一样的。

我还尝试按照 this StackOverflow post 在我的 database.yml 中设置 wait_timeout: 2147483 无济于事。

我正在使用:

  • 导轨 3.1.0
  • resque 1.20.0
  • resque-scheduler 1.9.9
  • mysql2 0.3.11

一切都在带有 RVM/Homebrew/Passenger 的 Mac 上运行。 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 ruby-on-rails resque mysql2


    【解决方案1】:

    当连接太多,mysql无法处理时会发生这种情况。

    尝试限制您正在执行的连接和处理的数量。与其并行运行,不如让一些请求串行运行。

    这更像是一个 Mysql 错误,而不是您的语言或框架错误:有关详细信息,请参阅 here

    【讨论】:

    • 不,这是 Resque 和 mysql 的常见问题。 Resque 没有重新连接...
    猜你喜欢
    • 2015-11-04
    • 2016-02-15
    • 2012-10-30
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2013-12-16
    • 2011-12-11
    相关资源
    最近更新 更多