お世話になります。
JSP業務アプリケーション短期開発入門付属のサンプルアプリケーションをLinuxサーバー上にデプロイしたところ、エラーが発生しました。
以下、そのエラーの解決をする過程で、
「この部分は潜在バグではないだろうか」
と思った部分がありました。
ここで、私は、何も著者の誤りを指摘したいわけではございません。
私の認識に間違いがないかということを確かめたいと思い、投稿しました。
もしかしたら、「これは、○○で△△という設定をしていれば回避できるエラーなんですよ」という回答が帰ってきて、「なるほど。そういう仕組みになってるのか」と、理解が深まる結果になるかもしれないと思い、投稿してみました。
〜〜以下、その潜在バグのように見える部分の詳細です。〜〜
JSP業務アプリケーション短期開発入門の115ページに、
grant all on jspdb.* to Mulder identified by 'TrustNo1';(@)
との記述があります。
Linux版のMYSQLの場合、@のSQLを実行後、Webアプリケーションを実行しても、MYSQLが、localhostからの接続を受け付けてくれず、エラーが発生します。
もし、localhostからの接続を受け付けるようにしたければ、
grant all on jspdb.* to Mulder@localhost identified by 'TrustNo1';
としないといけないようです。
ためしに、@のSQLを実行後、
select Host,User from mysql.user;
のSQL文を発行し、ユーザーに与えられた権限を見てみたところ、
+----------------+----------+------------------+
| Host | User | Password |
+----------------+----------+------------------+
| % | Mulder | 2de80b9e59602b87 |
+----------------+----------+------------------+
となっています。(linux版、windows版ともに)
ここで、hostの"%"とは、
(a)Linux上のMysqlの場合、localhost以外の全てのhostからの接続を受け付ける
(b)Windows上のMysqlの場合、localhostを含む全てのhostからの接続を受け付ける
という違いがあるようです。
http://linux.kororo.jp/cont/server/mysql_user.php
(これは参考です)
Windows版のMysql上でのみ動作し、全てのホストからのDB接続が可能な仕様ということなのでしょうか。
JSP業務アプリケーション短期開発入門付属のサンプルアプリケーションをLinuxサーバー上にデプロイしたところ、エラーが発生しました。
以下、そのエラーの解決をする過程で、
「この部分は潜在バグではないだろうか」
と思った部分がありました。
ここで、私は、何も著者の誤りを指摘したいわけではございません。
私の認識に間違いがないかということを確かめたいと思い、投稿しました。
もしかしたら、「これは、○○で△△という設定をしていれば回避できるエラーなんですよ」という回答が帰ってきて、「なるほど。そういう仕組みになってるのか」と、理解が深まる結果になるかもしれないと思い、投稿してみました。
〜〜以下、その潜在バグのように見える部分の詳細です。〜〜
JSP業務アプリケーション短期開発入門の115ページに、
grant all on jspdb.* to Mulder identified by 'TrustNo1';(@)
との記述があります。
Linux版のMYSQLの場合、@のSQLを実行後、Webアプリケーションを実行しても、MYSQLが、localhostからの接続を受け付けてくれず、エラーが発生します。
もし、localhostからの接続を受け付けるようにしたければ、
grant all on jspdb.* to Mulder@localhost identified by 'TrustNo1';
としないといけないようです。
ためしに、@のSQLを実行後、
select Host,User from mysql.user;
のSQL文を発行し、ユーザーに与えられた権限を見てみたところ、
+----------------+----------+------------------+
| Host | User | Password |
+----------------+----------+------------------+
| % | Mulder | 2de80b9e59602b87 |
+----------------+----------+------------------+
となっています。(linux版、windows版ともに)
ここで、hostの"%"とは、
(a)Linux上のMysqlの場合、localhost以外の全てのhostからの接続を受け付ける
(b)Windows上のMysqlの場合、localhostを含む全てのhostからの接続を受け付ける
という違いがあるようです。
http://linux.kororo.jp/cont/server/mysql_user.php
(これは参考です)
Windows版のMysql上でのみ動作し、全てのホストからのDB接続が可能な仕様ということなのでしょうか。
投稿:natsu1[natsu1]/2008年 06月 20日 09時 39分
/更新:2008年 06月 20日 10時 13分
RE:潜在バグではないかと思うのですがいかがでしょうか。
by 竹形 誠司[takegata]
どうも、竹形です。
>Linux上のMysqlの場合、localhost以外の全てのhostからの接続を受け付ける
私の方ではLinux上でもそのような動作は確認できませんでした。次のようなテストをしてみてください。
1. 「test1」という名前のデータベース領域を作成
Passwordの文字数から察すると、お使いのMySQLのバージョンがだいぶ古いようですが、もしかしたらそれが関係しているかも知れません。
>Linux上のMysqlの場合、localhost以外の全てのhostからの接続を受け付ける
私の方ではLinux上でもそのような動作は確認できませんでした。次のようなテストをしてみてください。
1. 「test1」という名前のデータベース領域を作成
mysql> create database test1;
2. 「user1」という名前のユーザを作成し、test1に権限を付与mysql> grant all on test1.* to user1 identified by 'TrustNo1';
3. mysql からexitして、user1で再ログインmysql> exit
$ mysql -u user1 -p
Enter password:
4. test1 データベース領域にアクセス$ mysql -u user1 -p
Enter password:
mysql> use test1
'%' が「localhost以外の全て」と解釈されるのであれば、ここでエラーになるはずです。Passwordの文字数から察すると、お使いのMySQLのバージョンがだいぶ古いようですが、もしかしたらそれが関係しているかも知れません。
投稿:竹形 誠司[takegata]/2008年 06月 20日 13時 57分
/更新:2008年 06月 20日 13時 59分
お世話になります。
これと同じテストを私のほうでも既に行ったのです。
念のため、もう一度やってみました。(両方ともlocalhostからのオペレーションです。)
その結果、
【Linux版のmysqlの場合】
3でエラー(ERROR 1045(28000): Access denied・・)となり、ログインできない。
ちなみに、ここで、mysql -u user1 とした場合、ログインできるが、先ほど作ったuser1とは別の新規ユーザーと認識されてログインしていることになるみたいで、
ログイン後、show databases; を実行してもtest1データベースは表示されず、4の use test1; もエラーとなります。
【windows版のmysqlの場合】
3でエラーとならず、ログインできる。
4もエラーとならず、実行できる。
それとmysqlのバージョンなのですが、以下のとおりです。
(バージョンの確認には、mysqladminコマンドを使用し、その応答結果を抜粋したものです)
Linux版のmysqlのバージョンが古いとも思えないのですが。
【Linux版のmysql】
Ver 8.41 Distrib 5.0.22, for redhat-linux-gnu on i686
Server version 5.0.22
【windows版のmysql】
Ver 8.41 Distrib 5.0.41, for Win32 on ia32
Server version 5.0.41-community-nt
ちなみに、
http://dev.mysql.com/doc/refman/5.1/ja/adding-users.html
ここでも、grant文の発行で、
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'・・・
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'・・・
とわざわざ、2回SQL文を発行しています。
そして、その後、mysql.user テーブルを見てみると別レコードとしてユーザーが登録されています。
竹形さんのご説明でいくと、1行目のほうは必要ないということになると思うのですが。。
これと同じテストを私のほうでも既に行ったのです。
念のため、もう一度やってみました。(両方ともlocalhostからのオペレーションです。)
その結果、
【Linux版のmysqlの場合】
3でエラー(ERROR 1045(28000): Access denied・・)となり、ログインできない。
ちなみに、ここで、mysql -u user1 とした場合、ログインできるが、先ほど作ったuser1とは別の新規ユーザーと認識されてログインしていることになるみたいで、
ログイン後、show databases; を実行してもtest1データベースは表示されず、4の use test1; もエラーとなります。
【windows版のmysqlの場合】
3でエラーとならず、ログインできる。
4もエラーとならず、実行できる。
それとmysqlのバージョンなのですが、以下のとおりです。
(バージョンの確認には、mysqladminコマンドを使用し、その応答結果を抜粋したものです)
Linux版のmysqlのバージョンが古いとも思えないのですが。
【Linux版のmysql】
Ver 8.41 Distrib 5.0.22, for redhat-linux-gnu on i686
Server version 5.0.22
【windows版のmysql】
Ver 8.41 Distrib 5.0.41, for Win32 on ia32
Server version 5.0.41-community-nt
ちなみに、
http://dev.mysql.com/doc/refman/5.1/ja/adding-users.html
ここでも、grant文の発行で、
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'・・・
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'・・・
とわざわざ、2回SQL文を発行しています。
そして、その後、mysql.user テーブルを見てみると別レコードとしてユーザーが登録されています。
竹形さんのご説明でいくと、1行目のほうは必要ないということになると思うのですが。。
投稿:natsu1[natsu1]/2008年 06月 20日 20時 25分
/更新:2008年 06月 20日 20時 32分
> ちなみに、ここで、mysql -u user1 とした場合、ログインできるが、先ほど作った
> user1とは別の新規ユーザーと認識されてログインしていることになるみたいで、
> ログイン後、show databases; を実行してもtest1データベースは表示されず、
> 4の use test1; もエラーとなります。
これはuserテーブルに匿名ユーザ(名前の無いユーザー)が登録されている場合に起こる現象です。匿名ユーザーを削除してから同様のテストを行ってみてください。
> 【Linux版のmysql】
> Ver 8.41 Distrib 5.0.22, for redhat-linux-gnu on i686
> Server version 5.0.22
これはそんなに古くないですね。password関数のハッシュ値が16バイトだったので、4.0より古いバージョンかと思ったのですが(バージョン4.1から41バイトになりました。)、これは思い過ごしでした。すみません。
> ちなみに、
> http://dev.mysql.com/doc/refman/5.1/ja/adding-users.html
> ここでも、grant文の発行で、
> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'・・・
> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'・・・
> とわざわざ、2回SQL文を発行しています。
これは、「monty@localhost と monty@% の2つが登録されている場合の説明」であって、両方を登録しなければならないということではないと思います。その後に匿名ユーザの説明もありますね。今回のケースは、これに該当するのではないでしょうか。
> user1とは別の新規ユーザーと認識されてログインしていることになるみたいで、
> ログイン後、show databases; を実行してもtest1データベースは表示されず、
> 4の use test1; もエラーとなります。
これはuserテーブルに匿名ユーザ(名前の無いユーザー)が登録されている場合に起こる現象です。匿名ユーザーを削除してから同様のテストを行ってみてください。
> 【Linux版のmysql】
> Ver 8.41 Distrib 5.0.22, for redhat-linux-gnu on i686
> Server version 5.0.22
これはそんなに古くないですね。password関数のハッシュ値が16バイトだったので、4.0より古いバージョンかと思ったのですが(バージョン4.1から41バイトになりました。)、これは思い過ごしでした。すみません。
> ちなみに、
> http://dev.mysql.com/doc/refman/5.1/ja/adding-users.html
> ここでも、grant文の発行で、
> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'・・・
> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'・・・
> とわざわざ、2回SQL文を発行しています。
これは、「monty@localhost と monty@% の2つが登録されている場合の説明」であって、両方を登録しなければならないということではないと思います。その後に匿名ユーザの説明もありますね。今回のケースは、これに該当するのではないでしょうか。
投稿:竹形 誠司[takegata]/2008年 06月 20日 22時 50分
/更新:2008年 06月 20日 22時 50分
お世話になります。
>その後に匿名ユーザの説明もありますね。今回のケースは、これに該当するのではないでしょうか。
その通りだったようです。
delete from user where user='';
flush privileges;
を実行し、匿名ユーザーを削除&設定を反映したところ、問題なくDB接続ができました。
失礼いたしました。m(__)m
余談ですが、今回の原因をまとめると、
linux版のmysqlには、デフォルトで匿名ユーザーは登録されていて
windows版のmysqlには、デフォルトで匿名ユーザーは登録されていない
ということになると理解したのですが、この理解で間違いないと考えていいでしょうか。
>その後に匿名ユーザの説明もありますね。今回のケースは、これに該当するのではないでしょうか。
その通りだったようです。
delete from user where user='';
flush privileges;
を実行し、匿名ユーザーを削除&設定を反映したところ、問題なくDB接続ができました。
失礼いたしました。m(__)m
余談ですが、今回の原因をまとめると、
linux版のmysqlには、デフォルトで匿名ユーザーは登録されていて
windows版のmysqlには、デフォルトで匿名ユーザーは登録されていない
ということになると理解したのですが、この理解で間違いないと考えていいでしょうか。
投稿:natsu1[natsu1]/2008年 06月 21日 06時 52分
/更新:2008年 06月 21日 06時 52分
> linux版のmysqlには、デフォルトで匿名ユーザーは登録されていて
> windows版のmysqlには、デフォルトで匿名ユーザーは登録されていない
私が試したopen SUSE 10.3 で「ソフトウェア管理」からインストールしたmysqlでは匿名ユーザーは登録されていませんでした。インストールのしかたによるのかも知れませんね。そういえば、MySQLの過去のバージョンでは、Windows版でも匿名ユーザーがデフォルトで登録されていました。
私はMacOSやOpenSolrisでもMySQL5.0を使っていますが、デフォルトでは匿名ユーザは登録されていなかったと思います。最近のバージョンで匿名ユーザーが登録されているケースがあることを知らなかったので、勉強になりました。これについては、ブログに書きたいと思います。ご報告ありがとうございました。
> windows版のmysqlには、デフォルトで匿名ユーザーは登録されていない
私が試したopen SUSE 10.3 で「ソフトウェア管理」からインストールしたmysqlでは匿名ユーザーは登録されていませんでした。インストールのしかたによるのかも知れませんね。そういえば、MySQLの過去のバージョンでは、Windows版でも匿名ユーザーがデフォルトで登録されていました。
私はMacOSやOpenSolrisでもMySQL5.0を使っていますが、デフォルトでは匿名ユーザは登録されていなかったと思います。最近のバージョンで匿名ユーザーが登録されているケースがあることを知らなかったので、勉強になりました。これについては、ブログに書きたいと思います。ご報告ありがとうございました。
投稿:竹形 誠司[takegata]/2008年 06月 21日 15時 15分
/更新:2008年 06月 21日 15時 30分