G-chan Square

じーちゃん/へたっぴの綴る、日々のつれづれとか。
twitterのまとめとゲームネタが中心。2015年からロードバイク/ミニベロ始めました。

[MySQL] MySQL5でHostに'%'があるとリモート接続できない?

こんばんわ、じーちゃんです。

原因不明の現象に悩まされております。
というのも、MySQLにとあるアカウントを作成して、そいつはどのホストからでも接続できるように、接続元ホストに'%'を指定しているのですが、さっぱり接続できないのです;;

(以下詳細)
さてさて、謎現象発生中なのです。

いきさつとしては、CakePHPの勉強をするに当たってMySQLにテーブルとか作る必要があるのですが、そのテーブル作成の作業をDB Designer 4を使おうとしたのですよ……

で、この「DB Designer 4」は優秀なので、ツール上で作ったテーブルスキーマをMySQLサーバーにSQL文で通知して、即座にテーブル作ったり消したり修正してくれる機能があるらしいのです。<使ったことがないけどw

んで、この機能を使うためには当然Winの端末PCからMySQLが動いているサーバーにアクセスできないとならないわけですが……それが、なぜかできない……

ま、最初は「あ、iptablesに3306の通過許可出してやらないと当然通るわけないよね?」とか一瞬にして気づくところは気づいたのですが……それで、「これでOKなはず!」という状態まで持っていっても繋がらない。

とりあえず、まずはWin→MySQLはあきらめて、Linux→MySQLに挑戦。これが通るなら、問題はWin側ってことになるんだけど……Linux→MySQLも通らない。

じーちゃんの環境では

"g-chan" <= このMovableTypeのブログを動かしている環境。
"xen01" <= Xenで作成されたヴァーチャル環境。完全開発用環境。

の2つがあるのですが、"g-chan"から"xen01"にmysqlを繋ごうとするとMySQLによって跳ねられる。
具体的には、こんな感じ。
$ mysql -u user -p'password' -h xen01 db
ERROR 1045 (28000): Access denied for user 'user'@'g-chan' (using password: YES)
※もちろん、アカウント名、パスワード、DB名は仮のものに書き換えてます。

ちなみに、"telnet g-chan 3306"はESTABLISHEDするので、iptablesとかの問題ではなくMySQLの設定上の問題であるとわかる。

で、MySQLサーバー上で、アカウント情報を確認してみる。
mysql> select user, host, password  from user where User = "user";
+--------------+-----------+------------------+
| user         | host      | password         |
+--------------+-----------+------------------+
| user         | localhost | 47009b58102a03f2 |
| user         | %         | 47009b58102a03f2 |
+--------------+-----------+------------------+
2 rows in set (0.00 sec)
localhostのほうは繋がっているので問題ないとして、問題は host が "%" になっているほう。
MySQLで"%"はワイルドカードなので、これで「どこからの接続でも許可をする」というMySQLでは、かなりメジャーな部類の設定のはずなのですよ。

ちなみに、これをGRANTするためのSQL文は
mysql> GRANT select,delete,insert,update ON db.* TO user@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
メジャーなMySQLハウツー本にはだいたい載っているようなメジャーなGRANT文ですよw
もちろん、"FLUSH PRIVILEGES;"をやってないとかいう、そーゆードジなオチはなしですw


で、この状態でつながらないので、いろいろWEB上で情報を探して試行錯誤した結果……ついに接続成功!
接続させるには、以下のように変更しました。
mysql> DROP USER user@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT select,delete,insert,update ON db.* TO user@'192.168.1.0/255.255.255.0' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> select user, host, password  from user where User = "user";
+--------------+---------------------------+------------------+
| user         | host                      | password         |
+--------------+---------------------------+------------------+
| user         | localhost                 | 47009b58102a03f2 |
| user         | 192.168.1.0/255.255.255.0 | 47009b58102a03f2 |
+--------------+---------------------------+------------------+
2 rows in set (0.00 sec)
ホスト名の指定のところで、「IPアドレス/サブネットマスク」の記述ができるってのを探し出してきたので試してみたところ、うまくいきました。
ちなみに、この "192.168.1.0/255.255.255.0" は "192.168.1.%" とも記述できるらしいのですが……こっちはダメ。ってことで、"%"がHostに含まれているとNG……ってことがわかったのですが、原因不明

ちなみに、MySQLのバージョンは5.0.40なのですが、5.0.XのGrant文のマニュアルページを見ると、
You can specify wildcards in the hostname. For example, user_name@'%.loc.gov' applies to
user_name for any host in the loc.gov domain, and user_name@'144.155.166.%' applies to
user_name for any host in the 144.155.166 class C subnet.
The simple form user_name is a synonym for user_name@'%'.
と書かれている。

The simple form user_name is a synonym for user_name@'%'.

これって、「user_nameの簡単なフォーム(記述法)は "user_name@'%'" と書くことだ」って意味だよね?w

……でも、よく考えてみると、Grant文自体は成功するので文法としては間違っていないのだろう。
ただ、なんの理由かわからないけど、Host部に'%'が入っていると想定通り動かないというだけで。

とりあえず、動かすことはできたけど、動かない理由がわからないので気持ち悪い状態。
誰か詳しいことを知っていたら教えてください。

コメント(2)

K.Y 返信

MySQL 5.6ですが'%'ではなく"%"でうまくいってます。

じーちゃん 返信

どうも、はじめまして、じーちゃんです。

ご報告ありがとうございます。
こちら2008年の古い記事ですので、いまはもう解消されているのかも知れないですね。

時間ができたら、自分でも試してみたいと思います。

コメントする