現象
古いシステムをベースに機能追加していると、WebサーバからMySQLに接続できない問題にぶつかりました。
【環境】
接続元: PHP 5.3 新規
接続先: MySQL 5.0.96 運用中
調査
調べてみるとこんな記事が。
http://www.ninton.co.jp/?p=1198
この記事によると、MySQLユーザーが古い16バイトのパスワードフォーマットであることが原因みたい。
PHP5.3から、mysqlドライバ部分がmysqlndライブラリに変更されて、41バイトのパスワードフォーマットを使用しないといけないとな。
対応としては、
1.my.cnfのold_passwords=0に変更してMySQL再起動。そしてユーザーのパスワードを設定する。
2.別のMySQLサーバをたててmy.cnfのold_passwords=0にして、そこでパスワード生成。それを本番のユーザーパスワードにコピー。
うーん、どっちも障壁が高いなあ。
my.cnfの設定を変えないままパスワード設定できないものだろうか?
できた
そうだ、今限りで設定を一時的に変更しよう。
SET @@session.old_passwords = 0;
OLD_PASSWORD関数でパスワード生成してみます。
SET PASSWORD FOR 'testuser'@'localhost' = OLD_PASSWORD('mypass');
セットしたら下記SQLで結果確認。
SELECT * FROM `mysql`.`user`;
→6f8c114b58f2ce9e
これがダメな16バイトハッシュのパスワードです。
では、本題の41バイトハッシュで。PASSWORD関数を使います。
SET PASSWORD FOR 'testuser'@'localhost' = PASSWORD('mypass');
→*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4
41バイトハッシュでパスワードを生成できました。
PHPからMySQLに接続できるようになりました。