2012-03-14 34 views
19

Recientemente actualizamos de MySQL 5.1.41 a 5.1.61 en nuestro servidor Ubuntu 10.04LTS. Tenemos una antigua aplicación web RoR que ahora está dando un error de protocolo de enlace malo:Ruby on Rails MySQL # 08S01Bad handshake - downgrade 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 

Googled alrededor y se topó con http://bugs.ruby-lang.org/issues/5017 la que me dice que es un error de extensión Rubí MySQL. No estamos usando la gema MySQL. Nuestra aplicación web es increíblemente vieja 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, por lo que solo debemos ponerlo funcional durante las próximas semanas hasta que lo reemplacemos con el nuevo sitio.

¿Cómo podemos superar este error? Estoy pensando que la degradación 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 degradando 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 tener aptitude para instalar la versión correcta de MySQL?

+1

* Estoy pensando que la degradación hasta MySQL 5.1.41 es la mejor manera de manejar esto * Si su código de conexión de base de datos está centralizado , tal vez usar la solución alternativa en su enlace? * Una solución alternativa para evitar este problema es no establecer una base de datos al establecer la conexión. * –

+1

Quizás es solo que no estoy tan familiarizado con RoR, pero no estoy seguro de cómo hacer esto. La configuración de conexión de la base de datos está en 'config/database.yml', y no estoy seguro de cómo lograr que el sitio interactúe con MySQL sin especificar el nombre de la base de datos en ese archivo. Intenté comentar el nombre de la base de datos, pero aparece un nuevo error: 'No se especificó ninguna base de datos. Falta argumento: base de datos. – Geoff

+1

Acabo de encontrar el mismo problema en la actualización de .49 a .61. En Debian Squeeze, degradado con: '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

Respuesta

2

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 de rebajar 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

que utilizan apt-cache para obtener la versión exacta.

2

También tuve el mismo problema. Agregue por favor:

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

Luego ejecute rake gems:install.

23

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

He encontrado esto: https://github.com/rubygems/rubygems/issues/423 Está funcionando bien.

En vez de hacer un corte en real_connect es posible añadir el "\0" en config/database.yml

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

EDITAR
Si utiliza la solución con \0 al final del nombre de la base de datos. Es probable que encuentre averiguar esto y resolverlo por sí mismo, pero lo menciono todos modos:
(al menos en mi versión de Rails)
utilizando la cadena de base de datos con \0 al final da un problema al hacer 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, así que no necesito tener \0 en ese nombre.
Aquí es un truco alternativa para resolver ese (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 
+0

usted es mi héroe – elju

Cuestiones relacionadas