seckie's programming memo

プログラミングするにあたって調べたことなどのメモ。たまにひどい英語で書く。

MySQLの設定がold_passwords=1になっている時にでくわすエラー

何年も前から運用されていたCentOS5.5のサーバー(さくらのVPS)にPHP5.6をインストールし、Cakephp3を動作させようとした。 その際、MySQLデータベースにうまく繋がらない問題が発生。

MySQLデータベースには専用ユーザーとデータベースは作成してある。ここからMigrationでテーブルを作成しようと、コマンドを実行すると以下のようにエラーで止まってしまう。

$ bin/cake migrations migrate

Warning Error: PDO::__construct(): The server requested authentication method unknown to the client [mysql_old_password] in [/path/to/app/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/MysqlAdapter.php, line 113]

エラーメッセージから調べてみる。

MySQL側で old_passwords というオプションが有効になっているとPHP側とパスワードハッシュの方式が異なってしまってパスワードが復号できなくなる模様。もちろん、PHP側の方が新しい方式。

一時的にMySQL側の設定を変えてしまって、パスワードを生成しなおせばOKだった。

; MySQLにログイン

$ mysql -u root -p

; 一時的に 'old_passwords' オプションを無効に。

mysql> SET @@session.old_passwords = 0;

; 41バイトのハッシュで該当ユーザーのパスワードを生成し直す

mysql> SET PASSWORD FOR username@localhost = PASSWORD('NEW_PASSWORD');