mysql ruby-on-rails ruby ubuntu-10.04

Ruby on Rails MySQL#08S01Bad apretón de manos-¿degradar MySQL?



ruby-on-rails ubuntu-10.04 (3)

Recientemente hemos actualizado de MySQL 5.1.41 a 5.1.61 en nuestro servidor Ubuntu 10.04LTS. Tenemos una antigua aplicación web de RoR que ahora está dando un error de apretón de manos mal:

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

Busqué en Google y tropecé con http://bugs.ruby-lang.org/issues/5017 que me dice que es un error de extensión de Ruby MySQL. No estamos usando la gema de MySQL. Nuestra aplicación web es increíblemente antigua y frágil (Ruby v1.8.7, Rails v1.2.3, Mongrel 1.1.5). Estamos en el proceso de reemplazarlo con una reescritura de Django, así que solo tenemos que ponerlo en funcionamiento durante las próximas semanas hasta que lo reemplacemos con el nuevo sitio.

¿Cómo podemos superar este error? Estoy pensando que degradar a MySQL 5.1.41 es la mejor manera de manejar esto, y luego, cuando comencemos a usar el nuevo sitio en unas pocas semanas, podemos volver a actualizar a 5.1.61. Sin embargo, estoy teniendo un problema al degradar mysql. Este es el comando que estoy usando:

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

Sin embargo, esto me dice Unable to find a version "5.1.41-3ubuntu12.10" for the package "mysql-server-5.1" . He intentado sudo aptitude install mysql-server-5.1=5.1.41 también, pero eso tampoco funcionó. ¿Cómo puedo hacer que aptitude instale la versión correcta de MySQL?


¡Lo arreglé! La degradación de MySQL hizo el truco. Volveremos a actualizar a 5.1.61 una vez que el sitio de Django entre en funcionamiento. Aquí está el comando para degradar 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

Utilicé apt-cache para obtener la versión exacta.


En lugar de degradar la gema de MySQL, es posible corregir el parámetro del nombre de la base de datos para solucionar el problema del "bad handshake" .

Encontré esto: https://github.com/rubygems/rubygems/issues/423 Está funcionando bien.

En lugar de hacer un hack en real_connect , es posible agregar el "/0" en config/database.yml

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

EDITAR
Si usa la solución con /0 al final del nombre de la base de datos. Probablemente lo descubrirás y lo resolverás tú mismo, pero lo menciono de todos modos:
( Al menos en mi versión de Rails )
El uso de la cadena de base de datos con /0 al final da un problema al realizar la rake test . Comienza con la eliminación de la base de datos de prueba antes de copiar las definiciones de la base de datos de desarrollo y luego utiliza una cadena de comandos SQL que incluye el nombre de la base de datos de prueba. Esto causará un error debido al /0 en el medio de la cadena.

En mi caso, estoy usando una base de datos de desarrollo local que no da ningún problema, por lo que no necesito tener /0 en ese nombre.
Aquí hay un truco alternativo para resolver eso (código original en 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


También tuve el mismo problema. Por favor añadir:

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

A continuación, ejecute rake gems:install .