この問題があり、Windows 7 より前のバージョンの Windows を使用している場合、これはおそらく問題の解決策ではありません。
なぜこうなった?
この問題の原因は IPv4 と IPv6 にあります。
IP アドレスの代わりにホスト名を使用すると、MySQL クライアントは最初に名前のAAAA
(IPv6) ホスト ルックアップを実行し、名前が IPv6 アドレスに正常に解決された場合は、最初にこのアドレスを試行します。いずれかのステップ (名前解決または接続) が失敗した場合、IPv4 にフォールバックし、A
ルックアップを実行して代わりにこのホストを試行します。
これが実際に意味することは、IPv6localhost
ルックアップが成功しても MySQL が IPv6 ループバックにバインドされていない場合、IPv4 フォールバックが発生し、接続は成功します。
これは Windows 7 より前の問題ではありませんでした。これはlocalhost
、ホスト ファイルを介して解決が行われ、127.0.0.1
IPv6 対応の::1
.
ただし、Windows 7 以降では、localhost
解決は DNS リゾルバーに組み込まれています。これは、IPv6 ルックアップが成功することを意味しますが、MySQL はその IPv6 アドレスにバインドされていないため、接続は失敗し、この質問で概説されている遅延が表示されます。
それはすばらしい。すでに修正する方法を教えてください!
いくつかのオプションがあります。インターネットを見回すと、一般的な「解決策」は、名前の代わりに IP アドレスを明示的に使用することのようですが、これを行わない理由がいくつかあります。どちらも移植性に関連しており、どちらも間違いなく重要ではありません。
しかし、それらはかなり重要に聞こえますか?
そうではありません。この種のものが構成ファイルで定義されるように、アプリケーションを設計する必要があります。スクリプトを別の環境に移動すると、他の設定も必要になる可能性があります。
要約すると、IP アドレスを使用することは最善の解決策ではありませんが、許容できる可能性が高いです。
それで、最善の解決策は何ですか?
最善の方法は、MySQL サーバーが使用するバインド アドレスを変更することです。ただし、これは好きなように単純ではありません。Apache、Nginx、およびこれまでに作成された他のほぼすべての正常なネットワーク サービス アプリケーションとは異なり、MySQL は単一のバインド アドレスのみをサポートするため、別のバインド アドレスを追加するだけではありません。幸いなことに、オペレーティング システムはここでちょっとした魔法をサポートしているので、MySQL が IPv4 と IPv6 の両方を同時に使用できるようにすることができます。
MySQL 5.5.3 以降を実行している必要があり、--bind-address=
コマンド ライン引数を使用して MySQL を起動する (または my.ini で対応するオプションを設定する) 必要があります。やりたいことに応じて、4 つのオプションdocsがあります。
あなたがおそらくよく知っているもの、そしてあなたが(効果的に)使用している可能性が最も高いもの0.0.0.0
. これにより、マシンで使用可能なすべての IPv4 アドレスにバインドされます。IPv6 を気にしなくても、::
.
明示的な IPv4 または IPv6 アドレス (たとえば127.0.0.1
、または::1
ループバック用)。これにより、サーバーがそのアドレスにバインドされ、そのアドレスのみがバインドされます。
魔法の糸::
。これにより、IPv4 および IPv6 モードで、マシン上のすべてのアドレス (ループバック アドレスと物理インターフェイス アドレスの両方) に MySQL がバインドされます。これはセキュリティ上のリスクとなる可能性があります。これは、MySQL がリモート ホストからの接続を受け入れる必要がある場合にのみ行ってください。
IPv4 にマッピングされた IPv6 アドレスを使用します。これは、4 から 6 への移行時の下位互換性のために IPv6 に組み込まれた特別なメカニズムであり、特定の IPv4 アドレスにバインドでき、IPv6 と同等です。これが「デュアル ループバック」アドレス以外の場合に役立つ可能性はほとんどありません::ffff:127.0.0.1
。ループバックにバインドするだけで、IPv4 と IPv6 の両方の接続を許可する、これがおそらくほとんどの人にとって最適なソリューションです。
hosts ファイルを変更する必要がありますか?
いいえ。hosts ファイルを変更しないでください。DNS リゾルバーは をどう処理するかを知っているためlocalhost
、再定義してもせいぜい効果がなく、最悪の場合、リゾルバーが完全に混乱します。
どう--skip-name-resolve
ですか?
これにより、問題が解決するか、問題を解決する必要がある場合もありますが、関連する理由はわずかに異なります。
PTR
この構成オプションがないと、MySQL はDNS クエリを介してすべてのクライアント接続 IP アドレスをホスト名に解決しようとします。MySQL サーバーで IPv6 の使用がすでに有効になっているにもかかわらず、接続に時間がかかる場合は、リバース DNS ( PTR
) レコードが正しく構成されていないことが原因である可能性があります。
名前解決を無効にすると、この問題は解決しますが、特にHost
条件で DNS 名を使用するように構成されたアクセス許可が失敗するなど、他の影響があります。
これを行う場合は、名前の代わりに IP アドレスを使用するようにすべての許可を構成する必要があります。