Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  DNS ルックアップの最適化とホストキャッシュ

8.11.5.2 DNS ルックアップの最適化とホストキャッシュ

MySQL サーバーはクライアントに関する情報 (IP アドレス、ホスト名、エラー情報) を格納するホストキャッシュをメモリーに保持します。サーバーはこのキャッシュを非ローカル TCP 接続に使用します。それは、ループバックインタフェースアドレス (127.0.0.1 または ::1) を使用して確立された TCP 接続、または Unix ソケットファイル、名前付きパイプ、または共有メモリーを使用して確立された接続には、キャッシュを使用しません。

新しいクライアント接続ごとに、サーバーはクライアント IP アドレスを使用して、クライアントホスト名がホストキャッシュ内にあるかどうかをチェックします。ない場合は、サーバーはホスト名の解決を試みます。まず、それは IP アドレスをホスト名に解決し、そのホスト名を再度 IP アドレスに解決します。次に、その結果と元の IP アドレスを比較して、それらが同じであることを確認します。サーバーはこの操作の結果に関する情報をホストキャッシュに格納します。キャッシュがいっぱいである場合、直近で使用されていないエントリが破棄されます。

host_cache パフォーマンススキーマテーブルは、SELECT ステートメントを使用して調査できるようにホストキャッシュの内容を公開します。これは、接続の問題の原因の診断に役立つことがあります。セクション22.9.10.1「host_cache テーブル」を参照してください。

サーバーは次のようにホストキャッシュ内のエントリを処理します。

  1. 最初の TCP クライアント接続が指定された IP アドレスからサーバーに到達すると、クライアント IP、ホスト名、およびクライアントルックアップ検証フラグを記録する新しいエントリが作成されます。最初に、ホスト名が NULL に設定され、フラグは false になります。このエントリは同じ発信元 IP からの後続のクライアント接続にも使用されます。

  2. クライアント IP エントリの検証フラグが false の場合、サーバーは IP からホスト名への DNS の解決を試みます。それが成功した場合、ホスト名が解決されたホスト名で更新され、検証フラグが true に設定されます。解決が成功しない場合、とられるアクションは、エラーが永続的か一時的かによって異なります。永続的なエラーの場合、ホスト名は NULL のままになり、検証フラグは true に設定されます。一時的なエラーの場合、ホスト名と検証フラグは変更されないままになります。(次回にクライアントがこの IP から接続したときは、別の DNS 解決の試みが行われます。)

  3. 特定の IP アドレスからの着信クライアント接続の処理中にエラーが発生した場合、サーバーはその IP のエントリ内の対応するエラーカウンタを更新します。記録されたエラーの説明については、セクション22.9.10.1「host_cache テーブル」を参照してください。

オペレーティングシステムでスレッドセーフな gethostbyaddr_r() および gethostbyname_r() 呼び出しをサポートしている場合、サーバーはそれらを使用してホスト名解決を実行します。そうでない場合、ルックアップを実行するスレッドは相互排他ロックを実行し、代わりに、gethostbyaddr() および gethostbyname() を呼び出します。この場合、相互排他ロックを保持するスレッドがそれを解放するまで、ほかのスレッドはホストキャッシュ内にないホスト名を解決できません。

サーバーはいくつかの目的でホストキャッシュを使用します。

  • IP からホスト名へのルックアップの結果をキャッシュすることによって、サーバーはクライアント接続ごとの DNS ルックアップの実行を回避します。代わりに、特定のホストに対して、そのホストからの最初の接続でのみルックアップを実行する必要があります。

  • キャッシュには、接続プロセス中に発生したエラーに関する情報が格納されます。一部のエラーはブロッキングとみなされます。成功した接続がない特定のホストから、これらの多くが連続して発生している場合、サーバーはそのホストからのその後の接続をブロックします。max_connect_errors システム変数は、ブロックが行われるまで許可されるエラーの数を指定します。セクションB.5.2.6「ホスト 'host_name' は拒否されました」を参照してください。

ブロックされたホストのブロックを解除するには、FLUSH HOSTS ステートメントを発行するか、mysqladmin flush-hosts コマンドを実行して、ホストキャッシュをフラッシュします。

ブロックされたホストからの最後の接続の試み以降に、ほかのホストからのアクティビティーが発生した場合、FLUSH HOSTS を使用しなくても、ブロックされたホストのブロックが解除される可能性があります。これは、キャッシュ内にないクライアント IP から接続が到着したときに、キャッシュがいっぱいである場合、サーバーが直近で使用されていないキャッシュエントリを破棄して、新しいエントリのための空きを作るために発生する可能性があります。破棄されたエントリがブロックされたホストのものである場合、そのホストのブロックが解除されます。

ホストキャッシュはデフォルトで有効になっています。それを無効にするには、サーバーの起動時や実行時に、host_cache_size システム変数を 0 に設定します。

DNSホスト名ルックアップを無効にするには、--skip-name-resolve オプションでサーバーを起動します。この場合、サーバーは IP アドレスのみを使用し、ホスト名を使用しないで、接続しているホストを MySQL 付与テーブル内の行と照合します。IP アドレスを使用してそれらのテーブルに指定されたアカウントのみを使用できます。

著しく遅い DNS と多くのホストがある場合、--skip-name-resolve で DNS ルックアップを無効にするか、または host_cache_size の値を増やしてホストキャッシュを大きくすることによって、パフォーマンスを向上できる可能性があります。

TCP/IP 接続を完全に禁止するには、--skip-networking オプションでサーバーを起動します。

一部の接続エラーは TCP 接続に関連付けられないか、接続プロセスのきわめて早期に (IP アドレスも判明する前に) 発生するか、または特定の IP アドレスに固有でありません (メモリー不足の状況など)。これらのエラーについては、Connection_errors_xxx ステータス変数をチェックしてください (セクション5.1.6「サーバーステータス変数」を参照してください)。