Ruby on Rails MySQL # 08S01Плохое рукопожатие - понизить версию MySQL? - PullRequest
19 голосов
/ 15 марта 2012

Мы недавно обновили 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

Я погуглил и наткнулся на 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?

Ответы [ 3 ]

23 голосов
/ 11 октября 2013

Вместо понижения версии MySQL gem можно исправить параметр имени базы данных, чтобы решить проблему "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
  ...

EDIT
Если вы используете решение с \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
2 голосов
/ 30 сентября 2012

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

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

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

2 голосов
/ 14 апреля 2012

Я исправил это!Понижение 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, чтобы получить точную версию.

...