2012年9月9日日曜日

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 件のコメント:

コメントを投稿