2012-03-14 27 views
19

Gần đây chúng tôi đã nâng cấp từ MySQL 5.1.41 lên 5.1.61 trên máy chủ Ubuntu 10.04LTS của chúng tôi. Chúng tôi có một ứng dụng web RoR xưa đó là bây giờ đưa ra một lỗi bắt tay xấu:Ruby on Rails MySQL # 08S01Bắt tay bắt tay - hạ cấp 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 

Tôi googled xung quanh và vấp vào http://bugs.ruby-lang.org/issues/5017 mà nói với tôi đó là một phần mở rộng của Ruby lỗi MySQL. Chúng tôi không sử dụng đá quý MySQL. Ứng dụng web của chúng tôi cực kỳ cũ và dễ vỡ (Ruby v1.8.7, Rails v1.2.3, Mongrel 1.1.5). Chúng tôi đang trong quá trình thay thế bằng ghi đè Django, vì vậy chúng tôi chỉ cần thực hiện chức năng này trong vài tuần tới cho đến khi chúng tôi thay thế bằng trang web mới.

Làm cách nào để vượt qua lỗi này? Tôi nghĩ rằng việc hạ cấp xuống MySQL 5.1.41 là cách tốt nhất để xử lý việc này, và sau đó khi chúng tôi bắt đầu sử dụng trang web mới trong một vài tuần, chúng tôi có thể nâng cấp lại lên 5.1.61. Tuy nhiên, tôi đang gặp sự cố khi hạ cấp mysql. Đây là lệnh Tôi đang sử dụng:

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

Tuy nhiên, điều này nói với tôi Unable to find a version "5.1.41-3ubuntu12.10" for the package "mysql-server-5.1". Tôi cũng đã thử sudo aptitude install mysql-server-5.1=5.1.41, nhưng điều đó cũng không hoạt động. Làm thế nào tôi có thể có aptitude cài đặt phiên bản chính xác của MySQL?

+1

* Tôi nghĩ rằng hạ để MySQL 5.1.41 là cách tốt nhất để xử lý này * Nếu mã kết nối cơ sở dữ liệu của bạn là tập trung , có lẽ sử dụng giải pháp thay thế trong liên kết của bạn? * Một giải pháp để tránh vấn đề này là không thiết lập một cơ sở dữ liệu khi thiết lập kết nối. * –

+1

Có lẽ nó chỉ là tôi không quen thuộc với RoR, nhưng tôi không chắc chắn làm thế nào để làm điều này. Các thiết lập kết nối cơ sở dữ liệu nằm trong 'config/database.yml', và tôi không chắc chắn làm cách nào khác để có được trang web để giao tiếp với MySQL mà không chỉ định tên cơ sở dữ liệu trong tệp đó. Tôi đã cố gắng bình luận ra tên cơ sở dữ liệu, nhưng tôi nhận được một lỗi mới: 'Không có cơ sở dữ liệu được chỉ định. Thiếu đối số: database.' – Geoff

+1

Tôi vừa gặp phải vấn đề tương tự khi nâng cấp từ .49 lên .61. Trên Debian Squeeze, hạ cấp với: '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

Trả lời

2

Tôi đã sửa nó! Hạ cấp MySQL đã làm các trick. Chúng tôi sẽ nâng cấp lại lên 5.1.61 khi trang web Django hoạt động. Đây là lệnh để hạ cấp 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

tôi đã sử dụng apt-cache để có được phiên bản chính xác.

2

Tôi cũng gặp vấn đề tương tự. Vui lòng thêm:

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

Sau đó chạy rake gems:install.

23

Thay vì hạ cấp đá quý MySQL, có thể sửa tham số tên cơ sở dữ liệu để khắc phục sự cố "bad handshake".

Tôi tìm thấy điều này: https://github.com/rubygems/rubygems/issues/423 Nó hoạt động tốt.

Thay vì làm một hack trong real_connect nó có thể để thêm "\0" trong config/database.yml

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

EDIT
Nếu bạn sử dụng các giải pháp với \0 ở phần cuối của tên cơ sở dữ liệu. Bạn có thể sẽ tìm tìm hiểu điều này và giải quyết nó cho mình, nhưng tôi đề cập đến nó anyway:
(ít nhất là trong phiên bản của tôi về Rails)
Sử dụng chuỗi cơ sở dữ liệu với \0 ở cuối cho vấn đề khi thực hiện rake test. Nó bắt đầu bằng việc xóa cơ sở dữ liệu thử nghiệm trước khi sao chép các định nghĩa cơ sở dữ liệu phát triển, và sau đó sử dụng một chuỗi lệnh SQL bao gồm tên cơ sở dữ liệu thử nghiệm. Điều này sẽ gây ra lỗi vì số \0 ở giữa chuỗi.

Trong trường hợp của tôi, tôi đang sử dụng cơ sở dữ liệu phát triển cục bộ không đưa ra bất kỳ vấn đề nào vì vậy tôi không cần phải có \0 trong tên đó.
Dưới đây là một hack thay thế để giải quyết đó (mã gốc trong 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

bạn là người hùng của tôi – elju