переход с postgres на mysql, вызывающий странные ошибки Mysql2 :: Ошибка: сервер MySQL исчез - PullRequest
1 голос
/ 10 февраля 2011

Я переключаю базу данных приложения rails 3.0.3, которое я разработал, с postgres на mysql, чтобы я мог использовать rds от amazon.Перед внесением изменений я запускал свой тестовый код с использованием mysql на моей машине с адаптером mysql2.Мой тестовый код выдает некоторые ошибки, которые я еще не смог до конца докопаться.В основном у меня есть модель, которая используется для хранения больших загрузок XML.Мой тестовый код выглядит примерно так:

test "xml upload for large file" do 
  file = File.new("test/files/lib/upload_sample.xml") 
  upload = XmlUpload.create(:xml_contents => contents = file.read) 
  ..... 
  ..... 
end 

Строка создания вызывает следующую ошибку

ActiveRecord::StatementInvalid: Mysql2::Error: SAVEPOINT active_record_1 does not exist:     ROLLBACK TO SAVEPOINT active_record_1 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/connection_adapters/abstract_adapter.rb:202:in `rescue in log' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract_adapter.rb:194:in `log' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/mysql2-0.2.6/lib/ active_record/connection_adapters/mysql2_adapter.rb:314:in `execute' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/mysql2-0.2.6/lib/ active_record/connection_adapters/mysql2_adapter.rb:358:in `rollback_to_savepoint' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/connection_adapters/abstract/database_statements.rb: 149:in `rescue in transaction' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/  active_record/connection_adapters/abstract/database_statements.rb: 127:in `transaction' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:204:in `transaction' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:287:in `with_transaction_returning_status' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:237:in `block in save' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:248:in `rollback_active_record_state!' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:236:in `save'  
....

Я сохранял содержимое файла в текстовом поле.Я понимаю, что я должен серьезно взглянуть на хранение файлов в s3, но это настройка, которая у меня есть на данный момент.В postgres все работало нормально, но для того, чтобы все работало с mysql, мне пришлось установить переменную: limit, чтобы вместо стандартного текстового поля использовался LONGTEXT.Файлы могут быть довольно большими, но когда я тестирую с использованием маленьких файлов, проблем не возникает

Я могу полностью лаять неправильное дерево, но я подозреваю, что проблема может быть вызвана разрывом соединения с базой данных на основеошибки, возникающие при попытке загрузить файл в режиме разработки.Я провел некоторую проверку на эту ошибку, и я не уверен, что может быть сбрасывать соединение, файл не занимает 8 часов (время сброса соединения по умолчанию) для вставки

Mysql2 :: Ошибка: MySQL serverпропал: INSERT INTO xml_uploads ........

Мои настройки database.yaml следующие.

test: 
   adapter: mysql2 
   encoding: utf8 
   reconnect: true 
   database: app_test 
   username: username 
   password: password 
   host: localhost 

У кого-нибудь есть какие-либо подсказки относительно того, в чем заключается проблема и как ее можно исправить?Любая помощь с этим будет принята с благодарностью.

1 Ответ

3 голосов
/ 11 февраля 2011

Я решил все же сохранить данные в S3, но мой друг указал мне направление решения этой проблемы, я проверил его, и оно сработало, поэтому я решил опубликовать его здесь на всякий случай сталкивается с той же проблемой.

В основном проблема вызвана тем, что для переменной max_allowed_packet задано значение, которое меньше размера поля blog / text. Запрос не может быть выполнен, поэтому соединение сбрасывается. Вот некоторые подробности о переменной max_allowed_packet

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_allowed_packet

, а также некоторая информация о его настройке на экземплярах rds

http://www.henrybaxter.ca/?p=111

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...