2012-03-14 16 views
19

Abbiamo recentemente effettuato l'aggiornamento da MySQL 5.1.41 a 5.1.61 sul nostro server Ubuntu 10.04LTS. Abbiamo un antico web app RoR che sta ora dando un errore di stretta di mano cattiva:Ruby on Rails MySQL # 08S01Bad handshake - downgrade di 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 intorno e siamo imbattuti in http://bugs.ruby-lang.org/issues/5017 che mi dice che è un'estensione bug rubino MySQL. Non stiamo usando la gemma MySQL. La nostra app Web è incredibilmente vecchia e fragile (Ruby v1.8.7, Rails v1.2.3, Mongrel 1.1.5). Stiamo per rimpiazzarlo con una riscrittura di Django, quindi dobbiamo solo renderlo funzionale per le prossime settimane fino a quando non lo sostituiremo con il nuovo sito.

Come possiamo superare questo errore? Sto pensando che il downgrade a MySQL 5.1.41 sia il modo migliore per gestirlo, e quindi quando inizieremo a utilizzare il nuovo sito tra qualche settimana, potremo eseguire nuovamente l'aggiornamento a 5.1.61. Tuttavia, sto riscontrando un problema di downgrade di mysql. Questo è il comando che sto usando:

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

Tuttavia, questo mi dice Unable to find a version "5.1.41-3ubuntu12.10" for the package "mysql-server-5.1". Ho provato anche sudo aptitude install mysql-server-5.1=5.1.41, ma non ha funzionato. Come posso installare aptitude la versione corretta di MySQL?

+1

* Sto pensando che il downgrade a MySQL 5.1.41 è il modo migliore per gestire questa situazione * Se il codice di connessione al database è centralizzato , forse usa la soluzione alternativa nel tuo link? * Una soluzione alternativa per evitare questo problema è non impostare un database quando si stabilisce la connessione. * –

+1

Forse è solo che non sono così familiare con RoR, ma non sono sicuro di come farlo. Le impostazioni di connessione al database sono in 'config/database.yml', e non sono sicuro di come il sito possa interfacciarsi con MySQL senza specificare il nome del database in quel file. Ho provato a commentare il nome del database, ma ottengo un nuovo errore: 'Nessun database specificato. Argomento mancante: database. – Geoff

+1

Ho appena riscontrato lo stesso problema durante l'aggiornamento da .49 a .61. Su Debian Squeeze, downgrade 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

risposta

2

L'ho risolto! Il downgrade di MySQL ha fatto il trucco. Ri-aggiorneremo alla 5.1.61 una volta che il sito Django sarà pubblicato. Ecco il comando di declassare 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

ho usato apt-cache per ottenere la versione esatta.

2

Ho anche avuto lo stesso problema. Aggiungi:

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

Quindi eseguire rake gems:install.

23

Invece di eseguire il downgrade di MySQL gem, è possibile correggere il parametro nome del database per risolvere il problema "bad handshake".

Ho trovato questo: https://github.com/rubygems/rubygems/issues/423 Funziona bene.

Invece di fare un hack in real_connect è possibile aggiungere il "\0" in config/database.yml

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

EDIT
Se si utilizza la soluzione con \0 alla fine del nome del database. Probabilmente troverete scoprire questo e risolvere da soli, ma io citare lo stesso:
(almeno nella mia versione di Rails)
utilizzando la stringa di database con \0 alla fine dà problema quando si fa rake test. Inizia con l'eliminazione del database di test prima di copiare le definizioni del database di sviluppo e quindi utilizzando una stringa di comando SQL che include il nome del database di test. Ciò causerà un errore a causa dello \0 nel mezzo della stringa.

Nel mio caso sto usando un database di sviluppo locale che non dà alcun problema quindi non ho bisogno di avere \0 con quel nome.
Ecco un hack alternativa per risolvere il (codice originale in 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

sei il mio eroe – elju