Rails 3.1.0 и Resque - «Mysql2 :: Ошибка: сервер MySQL ушел» - PullRequest
2 голосов
/ 25 февраля 2012

Помощь!Я продолжаю получать сообщения об ошибках «Сервер 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

в инициализаторе, как на код от разработчика Resque , с некоторыми изменениями, найденными в StackOverflow и в других местах.

Я также попробовал оба вышеперечисленных вместе.Результаты одинаковы.

Я также попытался установить wait_timeout: 2147483 в моем database.yml согласно этой записи StackOverflow безрезультатно.

Я использую:

  • рельсы 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'

I'mв недоумении здесь.Помощь очень ценится!

1 Ответ

0 голосов
/ 25 февраля 2012

Это происходит, когда слишком много соединений, которые mysql не может обработать.

Попробуйте ограничить количество соединений и обработок, которые вы делаете. Вместо того, чтобы работать параллельно, сделайте несколько запросов поочередно.

Это скорее ошибка Mysql, а не ошибка вашего языка или структуры: подробности см. здесь

...