Amazon Aurora MySQL インスタンスへの接続時に「Too Many Connections」エラーが表示されるのはなぜですか?

最終更新日: 2020 年 12 月 16 日

Amazon Aurora MySQL DB インスタンスに接続しようとしているのですが、「Too Many Connections」エラーが表示されます。DB インスタンスの最大接続値と、この値を調整する方法を教えてください。

簡単な説明

Amazon Aurora MySQL DB クラスターまたはインスタンスに接続しようとするときに、クライアントで「Too Many Connections」エラーが発生する場合は、利用可能なすべての接続が他のクライアントによって使用されていることを意味します。これは max_connections パラメータによって定義されます。

次の状況のいずれかが見れられる可能性があります。

  • Amazon CloudWatchDatabaseConnections メトリクスが Aurora MySQL DB インスタンスの max_connections 値に近い、または等しい。
  • max_connections パラメータの値が、接続用に DB インスタンスクラスによってプロビジョニングされた利用可能なメモリよりも大きい。CloudWatch の FreeableMemory メトリクス値が低いなどの兆候を調べてください。
  • MySQL エラーログに ERROR 1040(): Too many connections エラーが表示される。

max_connections 値には、以下の理由で到達する可能性があります。

  • DB インスタンスへのクライアント/アプリケーション接続数の急増、または段階的な増加。これには以下のような原因があります。
    • ワークロードの増加による接続の増加。
    • テーブル/行レベルのロックによるクライアント/アプリケーション接続の増加。
  • クライアント/アプリケーションが操作終了後に接続を適切に閉じていない。
  • wait_timeout および/または interactive_timeout などの接続タイムアウトパラメータの値が大きい。これは、sleeping 状態の接続の増加につながる場合があります。

最大接続エラーを解決する前に、まず DB インスタンスで現在実行されているすべてのスレッドを表示してください。その後、DB インスタンスでロギングを有効にします。

Aurora MySQL DB インスタンスで現在実行されているスレッドを表示する

SHOW FULL PROCESSLIST コマンドは、DB インスタンスで現在実行されているスレッドを表示します。DB インスタンスにログインしてから、以下のクエリを実行します。

SHOW FULL PROCESSLIST\G

以下のクエリを実行して、同じ結果セットを取得することもできます。

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST

注意: MySQL DB インスタンスで実行されているすべてのスレッドを表示するには、ユーザーアカウントに MySQL PROCESS サーバーの管理権限を付与する必要があります。付与しなければ、SHOW PROCESSLIST を実行しても、使用中の MySQL アカウントに関連付けられているスレッドしか表示されません。詳細については、MySQL ドキュメントで「Privileges provided by MySQL」を参照してください。

注意 SHOW FULL PROCESSLIST 文および INFORMATION_SCHEMA.PROCESSLIST 文は mutex を必要とするため、パフォーマンスに悪影響を及ぼす場合があります。

Aurora MySQL DB インスタンスでロギングを有効化する

Aurora MySQL DB インスタンスでのロギングは、enabling general_logslow_query_log、または高度な監査のログパラメータで有効化します。

解決方法

最大接続エラーは、次のいずれかの方法を使用して解決します。

  • 既存の接続を確認し、可能であればそれらを終了して接続数を減らす。例えば、スリープ状態の接続を終了することから始めます。
  • DB インスタンスへの最大接続数を増やす。

DB インスタンス上の既存の接続を終了する

rds_kill コマンドと rds_kill_query コマンドを実行して、DB インスタンスで現在実行されているユーザーセッション、またはクエリを終了します。

CALL mysql.rds_kill(thread-ID);
CALL mysql.rds_kill_query(thread-ID);

DB インスタンスへの最大接続数を増やす

以下の方法を使用して、DB インスタンスへの最大接続数を増やします。

  • より多くのメモリを備えた DB インスタンスクラスにインスタンスをスケールアップする。 注意: DB インスタンスクラスをスケールすると、インスタンスが停止します。
  • インスタンスレベルのカスタムパラメータグループを使用して、より大きな値を max_connections パラメータに設定する。max_connections パラメータの増加によってインスタンスが停止することはありませんが、DB インスタンスがデフォルトのパラメータグループを使用している場合は、そのパラメータグループをカスタムパラメータグループに変更してください。パラメータグループを変更すると、インスタンスが停止します。詳細については、DB パラメータグループを使用するを参照してください。

注意: Aurora MySQL DB インスタンスに対して許可される接続の最大数は、DB インスタンスのインスタンスレベルパラメータグループにある max_connections パラメータによって決定されます。以下の例を参照してください。

max_connections = GREATEST({log(DBInstanceClassMemory/805306368)*45},{log(DBInstanceClassMemory/8187281408)*1000})

DB インスタンスの max_connections パラメータの現在の値を確認します。これは、DB インスタンスにアタッチされているパラメータグループをチェックする、または以下のクエリを実行して確認します。

select @@max_connections;

max_connections パラメータには以下の仕様があります。

  • DB クラスターと DB インスタンス両方のパラメータグループに設定できる。ただし、有効になるのはインスタンスレベルのパラメータ設定です。
  • 指定できる値は、1 から 16000 までの整数です。
  • 本質的に動的 (このパラメータ値を変更するために再起動する必要はありません)。

Aurora MySQL で使用できる各 DB インスタンスクラスの max_connections のデフォルト値に関する詳細については、「Aurora MySQL DB インスタンスへの最大接続数」を参照してください。

注意: Aurora MySQL および Amazon Relational Database Service (Amazon RDS) MySQL の DB インスタンスでは、メモリオーバーヘッドの量が異なります。max_connections 値は、同じインスタンスクラスを使用する Aurora MySQL と RDS MySQL の DB インスタンスで異なる場合があります。リストされている値は、Aurora MySQL にのみ適用されます。

max_connections パラメータを調整するためのベストプラクティス

DB インスタンスに max_connections パラメータを使用するときは、以下を考慮するようにしてください。

  • デフォルトの接続制限は、バッファプールやクエリキャッシュなど、その他の主要メモリコンシューマのデフォルト値を使用するシステム用に調整されています。DB クラスター用にこれらの設定を変更する場合は、DB インスタンスでの使用可能なメモリの増減を考慮して接続制限を調整することを検討してください。
  • max_connections は、各インスタンスで開かれることが想定される接続の最大数よりもわずかに大きい値に設定します。
  • performance_schema も有効にしている場合は、max_connections パラメータの設定に注意してください。パフォーマンススキーマのメモリ構造のサイズは、max_connections を含めたサーバー設定変数に基づいて自動的に決定されます。変数に大きな値を設定するほど、パフォーマンススキーマが使用するメモリも増加します。極端なケースでは、これが T2 および T3 などのスモールインスタンスタイプでのメモリ不足問題を引き起こす場合があります。パフォーマンススキーマを使用している場合は、max_connections をデフォルト値のままにしておくことがベストプラクティスです。max_connections の値をデフォルト値から大幅に引き上げる予定の場合は、パフォーマンススキーマの無効化を検討してください。 注意: Aurora MySQL DB インスタンスに対して Performance Insights を有効にする場合は、パフォーマンススキーマが自動的に有効化されます。

調整には、以下の MySQL 接続パラメータを検討することも可能です。

  • wait_timeout: サーバーが非対話型の TCP/IP 接続または UNIX ファイル接続でのアクティビティを終了する前に待機する秒数。
  • interactive_timeout: サーバーが対話型接続でのアクティビティを終了する前に待機する秒数。
  • net_read_timeout: 読み取りをドロップする前に TCP/IP 接続からのより多くのデータを待機する秒数。
  • net_write_timeout: 書き込みをドロップする前に、ブロックの書き込みのために TCP/IP 接続を待機する秒数。
  • max_execution_time: ミリ秒単位での SELECT 文の実行タイムアウト。
  • max_connect_errors: 中断された接続の数がこの値を超える場合、ホストがそれ以降の接続からブロックされます。
  • max_user_connections: 任意の MySQL アカウントに許可される同時接続の最大数。

注意: これらのパラメータに対する推奨値またはカスタム値は個々のユースケースに応じて異なるため、この記事にはこれらの値が含まれていません。