MySQL サーバーは、クライアントに関する情報を含むインメモリーホストキャッシュを保持: IP アドレス、ホスト名およびエラー情報。 パフォーマンススキーマ host_cache
テーブルは、SELECT
ステートメントを使用して検査できるように、ホストキャッシュの内容を公開します。 これは、接続の問題の原因の診断に役立つことがあります。 セクション27.12.19.5「host_cache テーブル」を参照してください。
次のセクションでは、ホストキャッシュの動作、およびキャッシュの構成方法やモニター方法などのその他のトピックについて説明します。
サーバーは、localhost 以外の TCP 接続にのみホストキャッシュを使用します。 ループバックインタフェースアドレス (127.0.0.1
や::1
など) を使用して確立された TCP 接続、または Unix ソケットファイル、名前付きパイプまたは共有メモリーを使用して確立された接続には、キャッシュは使用されません。
サーバーはいくつかの目的でホストキャッシュを使用します。
IP からホスト名へのルックアップの結果をキャッシュすることで、サーバーはクライアント接続ごとにドメインネームシステム (DNS) ルックアップを行わないようにします。 代わりに、特定のホストに対して、そのホストからの最初の接続でのみルックアップを実行する必要があります。
キャッシュには、クライアント接続プロセス中に発生したエラーに関する情報が含まれます。 一部のエラーは「ブロッキング」とみなされます。 成功した接続がない特定のホストから、これらの多くが連続して発生している場合、サーバーはそのホストからのその後の接続をブロックします。
max_connect_errors
システム変数は、ブロックが発生するまでの連続エラーの許容数を決定します。
適用可能な新しいクライアント接続ごとに、サーバーはクライアント IP アドレスを使用して、クライアントホスト名がホストキャッシュ内にあるかどうかを確認します。 その場合、ホストがブロックされているかどうかに応じて、サーバーは接続リクエストの処理を拒否または続行します。 ホストがキャッシュ内にない場合、サーバーはホスト名の解決を試みます。 まず、それは IP アドレスをホスト名に解決し、そのホスト名を再度 IP アドレスに解決します。 次に、その結果と元の IP アドレスを比較して、それらが同じであることを確認します。 サーバーはこの操作の結果に関する情報をホストキャッシュに格納します。 キャッシュがいっぱいである場合、直近で使用されていないエントリが破棄されます。
サーバーは、gethostbyaddr()
および gethostbyname()
システムコールを使用してホスト名解決を実行します。
サーバーは次のようにホストキャッシュ内のエントリを処理します。
最初の TCP クライアント接続が特定の IP アドレスからサーバーに到達すると、クライアント IP、ホスト名およびクライアント検索検証フラグを記録するための新しいキャッシュエントリが作成されます。 最初に、ホスト名が
NULL
に設定され、フラグは false になります。 このエントリは、同じ発信元 IP からの後続のクライアント TCP 接続にも使用されます。クライアント IP エントリの検証フラグが false の場合、サーバーは IP-to-host name-to-IP DNS 解決を試みます。 それが成功した場合、ホスト名が解決されたホスト名で更新され、検証フラグが true に設定されます。 解決が成功しない場合、とられるアクションは、エラーが永続的か一時的かによって異なります。 永続的なエラーの場合、ホスト名は
NULL
のままになり、検証フラグは true に設定されます。 一時的なエラーの場合、ホスト名と検証フラグは変更されないままになります。 (この場合、クライアントが次回この IP から接続したときに、別の DNS 解決が試行されます。)特定の IP アドレスからの着信クライアント接続の処理中にエラーが発生した場合、サーバーはその IP のエントリ内の対応するエラーカウンタを更新します。 記録されたエラーの説明については、セクション27.12.19.5「host_cache テーブル」を参照してください。
ブロックされたホストのブロックを解除するには、ホストキャッシュをフラッシュします。ブロックされたホストの処理 を参照してください。
ほかのホストからのアクティビティーが発生した場合でも、ブロックされたホストがホストキャッシュをフラッシュせずにブロック解除される可能性があります:
キャッシュに存在しないクライアント IP から接続が到着したときにキャッシュがいっぱいになった場合、サーバーは新しいエントリ用の領域を確保するために、最も最近使用されていないキャッシュエントリを破棄します。
破棄されたエントリがブロックされたホストのものである場合、そのホストのブロックが解除されます。
一部の接続エラーは TCP 接続に関連付けられないか、接続プロセスのきわめて早期に (IP アドレスも判明する前に) 発生するか、または特定の IP アドレスに固有でありません (メモリー不足の状況など)。 これらのエラーについては、Connection_errors_
ステータス変数をチェックしてください (セクション5.1.10「サーバーステータス変数」を参照してください)。
xxx
ホストキャッシュはデフォルトで有効になっています。 host_cache_size
システム変数は、キャッシュの内容を公開するパフォーマンススキーマ host_cache
テーブルのサイズだけでなく、そのサイズも制御します。 キャッシュサイズはサーバーの起動時に設定でき、実行時に変更できます。 たとえば、起動時にサイズを 100 に設定するには、サーバー my.cnf
ファイルに次の行を入力します:
[mysqld]
host_cache_size=200
実行時にサイズを 300 に変更するには、次のようにします:
SET GLOBAL host_cache_size=300;
サーバーの起動時または実行時に host_cache_size
を 0 に設定すると、ホストキャッシュが無効になります。 キャッシュを無効にすると、サーバーはクライアントが接続するたびに DNS ルックアップを実行します。
実行時にキャッシュサイズを変更すると、ホストキャッシュをクリアし、host_cache
テーブルを切り捨て、ブロックされたホストをブロック解除する暗黙的なホストキャッシュフラッシュ操作が発生します。ホストキャッシュのフラッシュ を参照してください。
--skip-host-cache
オプションの使用は、host_cache_size
システム変数を 0 に設定するのと似ていますが、host_cache_size
は、サーバーの起動時だけでなく、実行時にホストキャッシュのサイズ変更、有効化、および無効化にも使用できるため、より柔軟です。 --skip-host-cache
を使用してサーバーを起動しても、host_cache_size
の値に対する実行時の変更は妨げられませんが、このような変更は効果がなく、host_cache_size
が 0 より大きい値に設定されていてもキャッシュは再度有効になりません。
DNS ホスト名検索を無効にするには、skip_name_resolve
システム変数を有効にしてサーバーを起動します。 この場合、サーバーは IP アドレスのみを使用し、ホスト名を使用しないで、接続しているホストを MySQL 付与テーブル内の行と照合します。 IP アドレスを使用してそれらのテーブルに指定されたアカウントのみを使用できます。 (クライアント IP アドレスを指定するアカウントが存在しない場合、クライアントは接続できない可能性があります。)
非常に遅い DNS および多数のホストがある場合は、skip_name_resolve
で DNS ルックアップを無効にするか、host_cache_size
の値を増やしてホストキャッシュを大きくすることで、パフォーマンスを向上させることができます。
TCP/IP 接続を完全に禁止するには、skip_networking
システム変数を有効にしてサーバーを起動します。
ホストのブロックが発生する前に、連続する接続エラーの許容数を調整するには、max_connect_errors
システム変数を設定します。 たとえば、起動時に値を設定するには、サーバーの my.cnf
ファイルに次の行を入力します:
[mysqld]
max_connect_errors=10000
実行時に値を変更するには、次のようにします:
SET GLOBAL max_connect_errors=10000;
パフォーマンススキーマ host_cache
テーブルは、ホストキャッシュの内容を公開します。 このテーブルは、接続の問題の原因の診断に役立つ可能性のある SELECT
ステートメントを使用して調べることができます。 このテーブルの詳細は、セクション27.12.19.5「host_cache テーブル」 を参照してください。
次の条件下では、ホストキャッシュをフラッシュすることをお勧めします:
クライアントホストの一部が IP アドレスを変更します。
正当なホストからの接続に対して
Host '
というエラーメッセージが表示されます。 (ブロックされたホストの処理を参照してください。)host_name
' is blocked
ホストキャッシュをフラッシュすると、次の効果があります:
インメモリーホストキャッシュをクリアします。
キャッシュの内容を公開するパフォーマンススキーマ
host_cache
テーブルからすべての行が削除されます。ブロックされたホストのブロックを解除します。 これにより、これらのホストからの以降の接続試行が可能になります。
ホストキャッシュをフラッシュするには、次のいずれかの方法を使用します:
host_cache_size
システム変数の値を変更します。 これには、SYSTEM_VARIABLES_ADMIN
権限 (または非推奨のSUPER
権限) が必要です。パフォーマンススキーマ
host_cache
テーブルを切り捨てるTRUNCATE TABLE
ステートメントを実行します。 これには、テーブルに対するDROP
権限が必要です。FLUSH HOSTS
ステートメントを実行します。 これには、RELOAD
権限が必須です。mysqladmin flush-hosts コマンドを実行します。 これには、パフォーマンススキーマ
host_cache
テーブルに対するDROP
権限またはRELOAD
権限が必要です。
サーバーはホストキャッシュを使用して、クライアント接続プロセス中に発生したエラーを追跡します。 次のエラーが発生する場合は、mysqld が途中で中断された多数の接続要求を特定のホストから受け取ったことを意味します。
Host 'host_name' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
max_connect_errors
システム変数の値によって、ホストをブロックする前にサーバーが許可する連続した中断された接続リクエストの数が決まります。 正常に接続されずに max_connect_errors
がリクエストに失敗した後、サーバーはなんらかの問題がある (たとえば、だれかがブレークしようとしている) とみなし、それ以降の接続リクエストからホストをブロックします。
ブロックされたホストのブロックを解除するには、ホストキャッシュをフラッシュします。ホストキャッシュのフラッシュ を参照してください。
または、エラーメッセージが表示されないようにするには、ホストキャッシュの構成 の説明に従って max_connect_errors
を設定します。 max_connect_errors
のデフォルト値は 100 です。 max_connect_errors
を大きい値に増やすと、ホストがしきい値に達してブロックされる可能性が低くなります。 ただし、Host '
エラーメッセージが表示された場合は、まずブロックされたホストからの TCP/IP 接続に問題がないことを確認します。 ネットワークに問題がある場合、host_name
' is blockedmax_connect_errors
の値を増やすことは適切ではありません。