Вопрос по ruby-on-rails-4, mysql – Попытка обновить 640 тыс. Строк в mySQL приводит к «Потерянному соединению с сервером MySQL во время запроса»

4

Я пытаюсь выполнить эту строку из моего файла seed.rb:

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

Мой стол называетсяBairros» имеет 643 тыс. строк и, как только он достигнет этого файла наrake db:seed команда выдает эту ошибку

    Mysql2::Error: Lost connection to MySQL server during query: UPDATE bairros SET created_at = (SELECT NOW());
/home/ubuntu/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:286:in `query'
/home/ubuntu/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:286:in `block in execute'
/home/ubuntu/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:425:in `block in log'
/home/ubuntu/.rvm/gems/[email protected]/gems/activesupport-4.0.0/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/ubuntu/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:420:in `log'
/home/ubuntu/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:286:in `execute'
/home/ubuntu/.rvm/gems/[email protected]/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 `'
/home/ubuntu/.rvm/gems/[email protected]/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
/home/ubuntu/.rvm/gems/[email protected]/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `block in load'
/home/ubuntu/.rvm/gems/[email protected]/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
/home/ubuntu/.rvm/gems/[email protected]/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
/home/ubuntu/.rvm/gems/[email protected]/gems/railties-4.0.0/lib/rails/engine.rb:540:in `load_seed'
/home/ubuntu/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/tasks/database_tasks.rb:153:in `load_seed'
/home/ubuntu/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/railties/databases.rake:181:in `block (2 levels) in '
/home/ubuntu/.rvm/gems/[email protected]/bin/ruby_noexec_wrapper:14:in `eval'
/home/ubuntu/.rvm/gems/[email protected]/bin/ruby_noexec_wrapper:14:in `'
Tasks: TOP => db:seed
(See full trace by running task with --trace)

Я действительно понятия не имею, как это исправить. Может ли кто-нибудь помочь мне?

Это происходит на семени моей базы данных. Я'не обновлять большое количество строк в базе данных, которая 'используется. Это произойдет только один раз, и мне нужно изменить его на указанное значение. renatojf
Это был просто пример. Мне нужно получить идентификатор из другой таблицы и сохранить его в этой таблице с 643 тыс. Записей. Так что мне нужно сделать это. Другое дело, что если я запускаю это на моей машине в режиме разработки, начальное число завершается правильно. В производстве на сервере с 512 МБ ОЗУ выдается ошибка. Я думаю, что это связано с фактом ограниченной памяти renatojf
Первое, что нужно сделать, это запустить запрос из консоли mysql и проверить, завершен ли он. Или вы могли бы подумать про себя, поскольку все они имеют одинаковую ценность, почему я храню их 643 000 раз? Tony Hopkinson
Это'Также возможно, в зависимости от базового типа таблицы, MySQL может давать сбой, например, небольшой буферный пул innodb может ограничить размер транзакции / запроса. ModulusJoe

Ваш Ответ

2   ответа
9

ActiveRecord.жатка, Когда включен, жнец сканирует пул соединений на наличиемертвых" соединения и закрывает их. В моем тестировании это выглядит чрезмерно усердно и закрывает совершенно живые соединения (как правило, те, которые выполняют несколько большие запросы).

Попробуйте очиститьreaping_frequency из вашего конфига БД (который его отключает) и посмотрите, поможет ли это. Сканируйте свою кодовую базу на наличие этой строки и убедитесь, чтоS не установлен (или просто удален!). Если вы видите строку, какconfig['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10знаю, что|| 10 на самом деле устанавливает низкий уровень по умолчанию 10 с. Этот паттерн некоторое время находился в базе кодов рельсов, покавернулся из-за этого вызывает различные проблемы, в том числеубивает длительные запросы, но все ещерекомендовано Heroku.

Если отключение жнеца исправит ситуацию, я бы рекомендовал оставить его отключенным. Rails больше не устанавливает его по умолчанию, и это, кажется, вызывает больше проблем, чем решает.

У меня была ошибка, как твоя, и именно так я ее исправил. Лично я держу это отключенным. Я написал о своей конкретной проблеме более подробно на моемблог «.

1

 означает, что либо:

1. Сбой базы данных во время выполнения запроса (может быть из-за перезапуска, повреждения таблицы и т. Д.).

2. Сеанс отключен из-за тайм-аута запроса (проверьте переменные wait_timeout и interactive_timeout в зависимости от вашего типа соединения), проблемы с сетью, кто-то \ что-то убил ваш запрос

3. В рельсах это может быть вызвано, когда соединение было получено жаткой пула соединений. Смотри мой ответ. William Denniss

Похожие вопросы