2012年8月18日土曜日

MySQL:リモートアクセスがない時





<meta charset="utf-8">
ローカルではうまく接続されているMySQLサーバーに、リモートからの接続ができない場合があります。
このようなときは、次の内容をテストヘボミョ点検しては、問題を確認することができる。


リモート接続時に起こる可能性のあるエラーメッセージは次のとおりである。

ERROR 2003(HY000):Can't connect to MySQL server on '...'
ERROR 1045(28000):Access denied for user 'user' @ 'host'(using password:...)

ERROR 2003は、接続に失敗した場合には、以下のチェックリストの中(1)から開始します。
ERROR 1045は、認証に失敗した場合には、以下のチェックリストの中(7)から開始します。



*設定ファイル(my.cnf / my.ini)より実行時に与えられるオプションの優先順位が高いので、設定ファイルと一緒に実行するオプションを綿密に調べることが重要である。

(1)skip-networking
mysqlサーバ実行時に - skip-networkingオプションを与えたり、設定ファイル内にskip-networkingがある場合、サーバーはローカルのUnixソケット接続を許可することになる。設定されている場合は解除する。


(2)bind-address
設定ファイル内にbind-addressの値または実行オプション - bind-addressの値が127.0.0.1または無効になっていることを確認します。これは、listen関連するTCP / IPソケットのバインドをどのようなIPにするかを決定する。 127.0.0.1は、外部接続を許可しないことを意味する。このシステムに割り当てられた特定のIPの値を指定したり、0.0.0.0を指定して、システムが持っているすべてのIPアドレスを使用するように変更します。割り当てられたIPアドレスが2つ以上の場合、適切な値を指定するのが一般的である。


(3)port
TCP / IPソケットのバインドに使用するポート番号を確認します。デフォルト値は3306ですが、セキュリティ上の理由や他のサーバーに複数のMySQLサーバを起動するために変更する場合がありますので、この値を確認する。実行オプションは、 - port = 3306、設定ファイルでは、port = 3306のように指定します。


(4)listenするかどうかを確認
shell> netstat-na | grep 3306
上記のコマンドを使用して、そのポートでLISTENになっていることを確認します。確認できない場合は1〜3までを再確認する。設定値を変更した後は、サーバーを再起動する必要があります。 (ポートの設定値が異なる場合は、そのポート番号を入力する)


(5)TCP / IPソケットで接続を試み
mysql clientをローカルで実行すると、一般的にmysql.sockファイルを介して接続するのが一般的である。
上記のオプションをすべて確認した後は、ローカルでTCP / IPソケットで接続を試みてみる。
shell> mysql-h 127.0.0.1-P 3306-u root-p

localhostと127.0.0.1は同じ名前だが、localhostに指定した場合には、UNIXソケットで接続を試みます。
ローカルでTCP / IP接続が失敗した場合、1〜4までを再確認する。


(6)ファイアウォール
ローカルでは、TCP / IPソケットで接続がうまくなるのに、遠隔地でない場合においても、telnetで接続を試みてみる。
shell> telnet-h xxx.xxx.xxx.xxx-P 3306

1〜5までは正常なのに、Telnet接続が不可能な場合は、ファイアウォールで防いでいる場合がほとんどである。ファイアウォールは、接続を試みるホストのローカルのファイアウォールは、接続対象となるサーバーのファイアウォールは、そのパスに置かれているルーティング内で、ファイアウォールなどがあります。
- ローカルファイアウォール:特定のoutgoingパケットが制限されているかどうかを確認する。
- サーバーのファイアウォール:MySQLサーバが使用しているポートのファイアウォールオプションを確認します。


(7)user / hostの組み合わせを確認
接続時に使用するユーザー名とホストアドレスが正しく登録されているmysqlデータベース内で確認する。
mysql> USE mysql;
mysql> SELECT user、host FROM user WHERE user = 'ユーザ名';

hostは、次のように指定します。
- %:すべてのホストからの接続を許可する
- xxx.xxx.xxx.xxx:特定のホストからの接続を許可する
- xxx.xxx。%など:特定の帯域からのアクセスを許可する
- 特定の名前:特定のホストからの接続を許可する(skip-name-resolveを使用している場合には使用不可)

MySQLのLIKEの使用される構文と同じように、%を使用して、特定の帯域またはホストを指定することができる。
例)192.168.0.0/16 => 192.168%


(8)パスワードの確認
接続に使用しているユーザー/ホスト/パスワードの組み合わせが正しいことを確認します。
mysql> SELECT COUNT(*)FROM user WHERE user = 'ユーザ名' AND host = 'ホスト' AND password = PASSWORD( 'パスワード')

そのユーザー名のレコードが複数ある場合は、その中で最も "特定の"値を指定し、レコードを最初に使用することになる。
(参照:http://dev.mysql.com/doc/refman/5.0/en/connection-access.html)

たとえば、user1 @%とuser1@192.168.0.1のレコードが存在する場合、192.168.0.1のホストからuser1のユーザーにアクセスを試みると、user1 @%の値を使用せずにuser1@192.168.0.1の値を使用して認証を行うことになるので、そのユーザー名で複数のレコードがある場合は、権限とパスワードの設定よりも多くの注意を要する。


(9)FLUSH PRIVILEGES
userテーブルと権限に関連するテーブルの値を追加/変更した場合には、必ず、次の構文を使用して、サーバーが新しい認証データを使用するようにします。
mysql> FLUSH PRIVILEGES;


(10)skip-name-resolve
skip-name-resolveオプションを指定しない場合は、MySQLサーバは、リモート接続するホストのIPをDNSで名前を確認する過程を経ることになる。サーバーがインストールされているシステムのDNSが正しく設定されていない場合には、domain name resolvingでの遅延が誘発されることがありますので、内部ネットワークにインストールされてサーバーである場合には、この値を有効にするのが一般的である。

接続を試みるホストのIPがDNSで名前が得られた場合には、IPではなく名前でuserテーブルを参照するようになるので、これを通じた、混乱を避けるために指定することもある。


(11)その他の特別な状況の
MySQLは4.1から新しいパスワードハッシュ関数をデフォルトで使用していますが、4.1以前のlegacyクライアント/ ODBCコネクタを使用している場合には、以下のリンクを参照して、サーバーのsecure-auth、old-passwordsなどのオプションを適切に調整して使用する必要があります。
http://dev.mysql.com/doc/refman/5.0/en/password-hashing.html

1〜10のプロセスをすべてゴチョトウムエドかかわらず、1045エラーが発生した場合には、次のコマンドを使用して、そのユーザーのパスワードを古い方式のハッシュ値を指定した後、接続テストを実行してみる。珍しいことだが、MySQLバージョン5台のmysql clientがold-password hashingを使用している場合があった。
mysql> SET PASSWORD FOR 'user' @ 'host' = OLD_PASSWORD( 'パスワード');


0 件のコメント:

コメントを投稿