试图更新mySQL中的640k行会导致"在查询期间丢失与MySQL服务器的连接"

ren*_*ojf 4 mysql ruby-on-rails-4

我正在尝试从seeds.rb文件中执行此行:

ActiveRecord::Base.connection.execute("UPDATE bairros SET created_at = (SELECT NOW());")
Run Code Online (Sandbox Code Playgroud)

我的名为"bairros"的表有643k行,一旦rake db:seed命令到达此文件,就会抛出此错误

    Mysql2::Error: Lost connection to MySQL server during query: UPDATE bairros SET created_at = (SELECT NOW());
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:286:in `query'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:286:in `block in execute'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:425:in `block in log'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activesupport-4.0.0/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:420:in `log'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:286:in `execute'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activerecord-4.0.0/lib/active_record/connection_adapters/mysql2_adapter.rb:220:in `execute'
/home/ubuntu/projetos/AnuncieImoveis/releases/20131015210221/db/seeds.rb:48:in `<top (required)>'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `block in load'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/railties-4.0.0/lib/rails/engine.rb:540:in `load_seed'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activerecord-4.0.0/lib/active_record/tasks/database_tasks.rb:153:in `load_seed'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/gems/activerecord-4.0.0/lib/active_record/railties/databases.rake:181:in `block (2 levels) in <top (required)>'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/bin/ruby_noexec_wrapper:14:in `eval'
/home/ubuntu/.rvm/gems/ruby-2.0.0-p195@thedoors/bin/ruby_noexec_wrapper:14:in `<main>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)
Run Code Online (Sandbox Code Playgroud)

我真的不知道如何解决这个问题.有人可以帮帮我吗?

Wil*_*iss 9

此错误还有另一个潜在原因,那就是ActiveRecord连接池收割机.启用后,收割者会扫描连接池中的"死"连接并关闭它们.在我的测试中,它似乎过于热心并且关闭了完全活跃的连接(通常是运行稍微大一点的查询).

尝试reaping_frequency从数据库配置中清除(将其关闭)并查看是否有帮助.扫描您的代码库以获取该字符串,并确保它未设置(或简单地删除!).如果您看到类似的行config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10,则知道|| 10实际上设置的默认值为10秒.这种模式在rails代码库中已经有一段时间了,直到由于它导致各种问题(包括杀死长时间运行的查询)而导致更改被还原,但仍然是Heroku推荐的.

如果禁用收割机修复了问题,我建议将其禁用.Rails默认不再设置它,它似乎会导致比它解决的问题更多的问题.

我有一个像你的错误,这就是我修复它的方式.就个人而言,我保持禁用.我在博客上更详细地写了我的具体问题.