普段は専らフロントエンド周辺の制作/開発を行っているのだけれど、
ここ数日〜1週間くらい、rubyおよびMySQLと格闘している。ただの趣味。
MySQLに接続できない
ruby-mysql(2.9.12) を使って、MySQL (5.1.69) に接続しようとして失敗する。
以下のログを確認。
/usr/local/lib/ruby/gems/2.0.0/gems/ruby-mysql-2.9.12/lib/mysql/protocol.rb:192:in `authenticate': The old style password is not supported (Mysql::ProtocolError)
パスワード方式が古い
Google先生に質問したところ、MySQLではバージョンアップでパスワードの方式が変更されていて、5系では 4.1以前の方式のパスワードをサポートしなくなったということらしい。
詳しいことはよく分からんが、要するにパスワードを新しい方式で書き換える必要があるということのようだ。
この問題に関連しそうな点で、ローカルとリモートサーバ上の環境はだいたい同じなのだけど、リモートにアップした時にこの問題に遭遇した。そこで、mysqlデータベース内に保存されているパスワードを確認してみた。
「mysql」データベース>「user」テーブル>「Password」カラム
すると、どちらも同じパスワードを設定しているはずなのに、保存されている値(暗号化されたあとの値)が異なっている。
なんで違っているのか
推測だけど、ローカルのはターミナル上からSQL文を手打ちしてユーザーを作成、パスワード設定したのに対し、
リモート上のはクライアントソフト(Sequel Pro)からユーザー作成、パスワード設定したため、そのときの設定がまずかったのだろうと思う。
パスワードを書き換える
当該ユーザーで問題のリモートサーバーのMySQLにログインして、以下のクエリを投げてやる。
SET SESSION old_passwords=0;
SET PASSWORD=PASSWORD('YOURDATABASEPASSWORD');
後で、「mysql」データベースの「user」テーブルを確認したところ、
「Password」カラムが確かに書き変わっているのが確認できた。(ローカルと同じになった)
このあと、先ほどのエラーは吐き出されなくなり、接続に成功した。
MySQLのパスワード方式が変更されたことがどういうことなのかとか、そういう原理的なことは理解してないが、解消策として書き残しておく。