MySQLのパスワード変更で30秒くらいはまった話

まとめ

MySQLはユーザをユーザ名とサーバ名で管理してるので、

SET PASSWORD FOR 'foo'@'localhost' = PASSWORD('hoge');

のようにちゃんとサーバ名を指定してあげる必要があります。

経緯

set password for foo = password('hoge');

としただけだと、localhostから繋ごうとしたときに接続できませんでした。んでちょろちょろとドキュメントとかみてユーザーテーブルをみるとこんな感じになってた。

mysql> select host, user, password from mysql.user;
+-----------+-------+-------------------------------------------+
| host      | user  | password                                  |
+-----------+-------+-------------------------------------------+
| localhost | root  | *B10588C362413D433112682F9997AAEB20273BFF |
| %         | foo   | *DAFAC111CDB80B040E7BFB4C647D6025E2AFF5AB |
| localhost | foo   | *5BD79BBCCD59CEB5DC80FB46F393EC6FA414994D |
+-----------+-------+-------------------------------------------+

どうやら、

set password for 'foo'@'%' = password('hoge');

として、全ホストを指定したのと同じことになってる様子。
なので、ちゃんとホストを指定して

mysql> SET PASSWORD FOR 'foo'@'localhost' = PASSWORD('hoge');
Query OK, 0 rows affected (0.00 sec)

としてやったら、ちゃんと変更できました。
MySQL :: MySQL 5.0 Reference Manual :: 13.7.1.6 SET PASSWORD Syntaxを読んで、現場で使える MySQL (DB Magazine SELECTION)にそんな記述があったのを思い出して読んだらちゃんと原因と対応法がわかりましたが、MySQLの超基本的なことを理解できてなかっただけでした。恥ずかしい><