Ruby on Rails MySQL # 08S01Bad рукопожатие - понижение рейтинга MySQL?
Недавно мы обновили с MySQL 5.1.41 до 5.1.61 на нашем сервере Ubuntu 10.04LTS. У нас есть старое веб-приложение RoR, которое теперь дает плохую рукопожатие:
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
Я googled вокруг и наткнулся на http://bugs.ruby-lang.org/issues/5017, который говорит мне, что это ошибка расширения Ruby 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.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
Вместо снижения рейтинга 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
Ответ 3
У меня тоже была такая же проблема. Пожалуйста, добавьте:
config.gem 'mysql', :version => '2.7'
Затем запустите rake gems:install
.