4

私は自分のシード.rbファイルからこの行を実行しようとしています:

ActiveRecord::Base.connection.execute("UPDATE bairros SET created_at = (SELECT NOW());")

「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)

これを修正する方法が本当にわかりません。誰でも私を助けてもらえますか?

4

2 に答える 2

9

このエラーには別の潜在的な理由があり、それは ActiveRecord 接続プールreaperです。有効にすると、リーパーは接続プールをスキャンして「無効な」接続を探し、それらを閉じます。私のテストでは、熱心すぎるように見え、完全に有効な接続も閉じます (通常、わずかに大きなクエリを実行する接続)。

DB 構成からクリアreaping_frequencyして (これによりオフになります)、それが役立つかどうかを確認してください。その文字列のコードベースをスキャンし、設定が解除されている (または単に削除されている!) ことを確認します。のような行が表示された場合は、が実際には 10 秒という低いデフォルトを設定しconfig['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10ていることがわかります。このパターンは、実行時間の長いクエリの強制終了など、さまざまな問題を引き起こしたために変更が元に戻さ|| 10れるまで、しばらく Rails コードベースにありましたが、Heroku では引き続き推奨されています。

リーパーを無効にすると問題が解決する場合は、無効のままにしておくことをお勧めします。Rails はデフォルトでこれを設定しなくなり、解決するよりも多くの問題を引き起こしているようです。

あなたのようなエラーがあり、それが修正方法でした。個人的には、無効のままにしています。特定の問題については、ブログで詳しく書きました。

于 2014-03-15T12:36:41.057 に答える
1

「クエリ中に MySQL サーバーへの接続が失われた」とは、次
のいずれかを意味します。
2. クエリのタイムアウト (接続の種類に応じて変数 wait_timeout と interactive_timeout を確認してください)、ネットワークの問題、誰か\何かがクエリを強制終了したため、セッションが切断されました。

于 2014-02-10T13:26:01.313 に答える