MySQLのユーザー権限について(ERROR 1045 (28000): Access denied for user …とかの問題)

mac minisnow leopardMySQLを動かしていて、Windowsマシンから黒猫 SQL Studio Nextでデータを表示させようとしている場合のお話です。

まず、Windowsマシンで黒猫 SQL Studio Next(以下黒猫)を使って、snow leopardのDBに接続するには、ODBCによる接続が必要。ODBCで接続するには、MySQLへの接続ユーザー/パスワードが必要。

というわけで、目的のDBに接続できるMySQLユーザーを作成し、権限を与えてやった。

(まずrootでMySQLにログインした)
mysql> grant select , insert, update ,  delete , drop , create on dbname.* to user1@'%' identified by 'password';

これで黒猫からselect, insert... ができるユーザー user1 が作成された。

上記コマンドの「%」は、ホストの指定なのだけど、「%」を指定することによって、どのホストでも黒猫を使ってselect, insert... ができることになる。


だから、localhost上でも同様にselect, insert... ができるよね?


と思いきや。

できん。できんのだ。localhost上、つまりはターミナルでログインした後に、selectやらが使われているスクリプトを実行できんのだ。スクリプト上はもちろん、コマンドラインからもMySQLユーザー user1 によるログインができんのだ。

$ mysql -u user1 -D dbname -p
Enter password:
ERROR 1045 (28000): Access denied for user 'user1'@'localhost' (using password: YES)


結論から言うと、localhostからもselect, insert... ができるようにgrantしてやらないといけない。

(まずrootでMySQLにログインした)
mysql> grant select , insert, update ,  delete , drop , create on dbname.* to user1@'localhost' identified by 'password';

これで他マシンからの接続や、localhost上からのログインができるようになった。

$ mysql -u user1 -D dbname -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2522
Server version: 5.1.39 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>


■まとめ
他マシンからのアクセスでのAccess deniedを解決するには、grantを2回打つべし。*1

mysql> grant select , insert, update ,  delete , drop , create on dbname.* to user1@'%' identified by 'password';
mysql> grant select , insert, update ,  delete , drop , create on dbname.* to user1@'localhost' identified by 'password';

これでダメなら /etc/my.cnfのbind-address設定やら、Windowsファイアウォールとかも見直せばいいかも。


これが解決するまで、いろいろと試しまくってこれまた3時間はロスしてしまった…。というかなんでMySQLはこんな仕様になってるのか誰か教えてエロい人。

*1:これが「イケてる」解決方法かどうかはともかく