2012-03-14 2 views
19

Недавно мы обновили с MySQL 5.1.41 до 5.1.61 на нашем сервере Ubuntu 10.04LTS. У нас есть древний RoR веб-приложение, которое теперь дает плохие ошибки квитирования:Ruby on Rails MySQL # 08S01Bad рукопожатие - понижение рейтинга MySQL?

Mysql::Error in MainController#index 

#08S01Bad handshake 

/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/vendor/mysql.rb:523:in `read' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/vendor/mysql.rb:153:in `real_connect' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:389:in `connect' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:152:in `initialize' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:82:in `new' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:82:in `mysql_connection' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:262:in `send' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:262:in `connection_without_query_cache=' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/query_cache.rb:54:in `connection=' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:230:in `retrieve_connection' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:78:in `connection' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:763:in `columns' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:2060:in `attributes_from_column_definition_without_lock' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/locking/optimistic.rb:45:in `attributes_from_column_definition' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1502:in `initialize_without_callbacks' 
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/callbacks.rb:225:in `initialize' 
#{RAILS_ROOT}/app/controllers/application.rb:48:in `new' 
#{RAILS_ROOT}/app/controllers/application.rb:48:in `log_info' 
/usr/local/bin/mongrel_rails:19:in `load' 
/usr/local/bin/mongrel_rails:19 

Я гугле вокруг и наткнулись на http://bugs.ruby-lang.org/issues/5017, который говорит мне, что это расширение ошибка рубин MySQL. Мы не используем жемчужину MySQL. Наше веб-приложение невероятно старое и хрупкое (Ruby v1.8.7, Rails v1.2.3, Mongrel 1.1.5). Мы в процессе замены его переписываем Django, поэтому нам просто нужно получить этот функционал в течение следующих нескольких недель, пока мы не заменим его новым сайтом.

Как мы можем пройти мимо этой ошибки? Я думаю, что переход к MySQL 5.1.41 - лучший способ справиться с этим, а затем, когда мы начнем использовать новый сайт через несколько недель, мы можем обновить его до 5.1.61. Тем не менее, у меня проблема с переопределением mysql. Это команда, я использую:

sudo aptitude install mysql-server-5.1=5.1.41-3ubuntu12.10

Однако, это говорит мне Unable to find a version "5.1.41-3ubuntu12.10" for the package "mysql-server-5.1". Я тоже пробовал sudo aptitude install mysql-server-5.1=5.1.41, но это тоже не сработало. Как я могу настроить aptitude правильную версию MySQL?

+1

* Я имею в виду, что понижение в MySQL 5.1.41 это лучший способ справиться с этим * Если код подключения к базе данных централизована , возможно, используйте обходной путь в вашей ссылке? * Обходной путь, чтобы избежать этой проблемы, заключается в том, чтобы не устанавливать базу данных при установлении соединения. * –

+1

Возможно, это не то, что я не так хорошо знаком с RoR, но я не уверен, как это сделать. Настройки подключения к базе данных находятся в 'config/database.yml', и я не уверен, как еще получить сайт для взаимодействия с MySQL без указания имени базы данных в этом файле. Я попытался прокомментировать имя базы данных, но я получаю новую ошибку: 'Нет указанной базы данных. Отсутствует аргумент: database.' – Geoff

+1

Я только что столкнулся с той же проблемой при обновлении с 0,49 до 0,61. В Debian Squeeze с понижением: sudo aptitude install mysql-server-5.1 = 5.1.49-3 mysql-client-5.1 = 5.1.49-3 mysql-common = 5.1.49-3 mysql-server-core-5.1 = 5.1.49-3 libmysqlclient16 = 5.1.49-3'. – gsreynolds

ответ

2

Я исправил его! Недостаток MySQL сделал трюк. Мы обновим до 5.1.61, как только сайт Django начнет жить. Вот команда принизить MySQL:

sudo aptitude install mysql-server-5.1=5.1.41-3ubuntu12 mysql-client-5.1=5.1.41-3ubuntu12 mysql-server-core-5.1=5.1.41-3ubuntu12

Я использовал apt-cache, чтобы получить точную версию.

2

У меня также была такая же проблема. Пожалуйста, добавьте:

config.gem 'mysql', :version => '2.7' 

Затем запустить rake gems:install.

23

Вместо того, чтобы понижать рейтинг MySQL, можно исправить параметр имени базы данных, чтобы исправить проблему "bad handshake".

Я нашел это: https://github.com/rubygems/rubygems/issues/423 Он работает хорошо.

Вместо того, чтобы делать хак в real_connect, что можно добавить в "\0"config/database.yml

production: 
    database: "itsalive_production\0" 
    adapter: mysql 
    host: localhost 
    encoding: UTF8 
    ... 

РЕДАКТИРОВАНИЕ
При использовании раствора с \0 в конце имени базы данных. Вы, вероятно, найдете выяснить это и решить ее самостоятельно, но я в любом случае говорить об этом:
(по крайней мере, в моей версии Rails)
Использование строки базы данных с \0 в конце дает проблемы при выполнении rake test. Он начинается с удаления тестовой базы данных перед копированием определений базы данных разработки, а затем с использованием командной строки SQL, содержащей имя тестовой базы данных. Это вызовет ошибку из-за \0 в середине строки.

В моем случае я использую локальную базу данных разработки, которая не дает никаких проблем, поэтому мне не нужно иметь \0 от этого имени.
Вот альтернатива хак, чтобы решить, что (исходный код в mysql_adapter.rb):

module ActiveRecord 
    module ConnectionAdapters 
    class MysqlAdapter 

     alias_method :old_execute, :execute 

     def execute(sql, name = nil) #:nodoc: 
     # This is needed because database names can end with "\0" to fix 
     # the issue with "handshake" when mysql server is newer than the gem 
     # requires. E.g. called when loading the new test db when doing "rake test". 
     sql = sql.delete("\0") 

     old_execute(sql, name) 
     end 
    end 
    end 
end 
+0

ты мой герой – elju