Aurora MySQL データベースの接続問題のトラブルシューティング - Amazon Aurora

Aurora MySQL データベースの接続問題のトラブルシューティング

アプリケーションと RDS DB インスタンスの間で信頼性の高い接続を確保することは、ワークロードのスムーズな運用に不可欠です。ただし、ネットワーク設定、認証の問題、リソースの制約など、さまざまな要因によって接続の問題が発生する場合があります。このガイドでは、Aurora MySQL の接続問題のトラブルシューティングに役立つ包括的なアプローチを提供します。

Aurora MySQL のデータベース接続問題の特定

接続問題のカテゴリを特定することは、潜在的な原因を絞り込み、トラブルシューティングプロセスを進めるのに役立ちます。カテゴリごとに、診断や解決のアプローチと手法は異なる場合があります。データベース接続の問題は、以下のカテゴリに大別できます。

接続エラーと例外

接続エラーと例外は、接続文字列の誤り、認証の失敗、ネットワークの中断、データベースサーバーの問題など、さまざまな原因で発生する場合があります。原因には、接続パラメータの設定ミス、無効な認証情報、ネットワーク停止、データベースサーバーのクラッシュや再起動が含まれます。セキュリティグループ、仮想プライベートクラウド (VPC) 設定、ネットワークアクセスコントロールリスト (ACL)、サブネットに関連付けられたルートテーブルの設定ミスも、接続問題につながる可能性があります。

接続制限の到達

この問題は、データベースサーバーへの同時接続数が最大許容数を超えた場合に発生します。データベースサーバーには、通常、クラスターとインスタンスパラメータグループのパラメータ max_connections で定義される設定可能な最大接続制限があります。データベースサーバーは、接続制限を課すことで、既存の接続を効率的に処理して許容可能なパフォーマンスを提供するための十分なリソース (メモリ、CPU、ファイルハンドルなど) を確保します。原因としては、アプリケーションの接続リーク、非効率的な接続プール、接続リクエストの予期しない急増などが考えられます。

接続タイムアウト

接続タイムアウトは、クライアントアプリケーションが指定のタイムアウト時間内にデータベースサーバーとの接続を確立できない場合に発生します。一般的な原因には、ネットワークの問題、サーバーの過負荷、ファイアウォールルール、接続設定の構成ミスなどがあります。

アイドル接続のタイムアウト

アイドル接続が長時間非アクティブのままになっていると、リソースを節約するために、データベースサーバーによって自動的に閉じられる場合があります。このタイムアウトは通常、wait_timeoutinteractive_timeout parameters を使用して設定可能であり、アプリケーションの接続の使用パターンに基づいて調整する必要があります。原因としては、接続を長期間アイドル状態にするアプリケーションロジックや、不適切な接続管理などがあります。

既存の接続の断続的な切断

このクラスのエラーは、クライアントアプリケーションとデータベースの間に確立した接続が、アクティブかつ使用中であっても、予期せず終了したり、不規則な間隔で断続したりする場合に発生します。これらの切断は断続的に発生します。つまり、不規則な間隔で発生し、一貫していません。以下のような原因が挙げられます。

  • 再起動やフェイルオーバーなどのデータベースサーバーの問題

  • アプリケーション接続の不適切な処理

  • 負荷分散とプロキシの問題

  • ネットワークの不安定性

  • 接続パスに関連したサードパーティのコンポーネントやミドルウェアの問題

  • クエリ実行タイムアウト

  • サーバー側またはクライアント側のリソース制約

包括的なモニタリング、ログ記録、分析を通じて根本原因を特定することが重要であるとともに、適切なエラー処理、接続プール、再試行メカニズムを実装することで、これらの断続的な切断がアプリケーションの機能とユーザーエクスペリエンスにもたらす影響を軽減できます。

Aurora MySQL の接続問題に関するデータの収集

アプリケーション、データベース、ネットワーク、インフラストラクチャコンポーネントに関する包括的なデータを収集することが、アプリケーションと Aurora MySQL データベースの間の接続問題の効果的なトラブルシューティングに不可欠です。関連するログ、設定、診断情報を収集することで、接続問題の根本原因の特定と、適切な解決策に役立つ貴重なインサイトが得られます。

セキュリティグループルール、VPC 設定、ルートテーブルなどのネットワークログと設定は、アプリケーションとデータベースとの正常な接続の確立を妨げる可能性があるネットワーク関連のボトルネックや設定ミスを特定するうえで不可欠です。これらのネットワークコンポーネントを分析することで、必要なポートが開いていること、IP アドレスが許可されていること、ルーティング設定が正しくセットアップされていることを確認できます。

タイムスタンプ

接続問題が発生したときの正確なタイムスタンプを記録します。これは、パターンを特定したり、問題を他のイベントやアクティビティと関連付けたりするのに役立ちます。

DB エンジンログ

一般的なデータベースログに加えて、データベースエンジンログ (MySQL エラーログやスロークエリログなど) を通じて、断続的な接続問題に関連していると思われる情報やエラーを確認します。詳細については、「Aurora MySQL データベースのログ記録」を参照してください。

クライアントアプリケーションログ

データベースに接続するクライアントアプリケーションから詳細なログを収集します。アプリケーションログは、接続試行、エラー、関連情報をアプリケーションの視点から可視化します。これにより、接続文字列、認証情報、またはアプリケーションレベルの接続処理に関連する問題が明らかになる場合があります。

一方、データベースログは、データベース側のエラー、スロークエリ、または接続問題の原因の可能性があるイベントに関するインサイトを提供します。詳細については、「Aurora MySQL データベースのログ記録」を参照してください。

クライアント環境変数

プロキシ設定、SSL/TLS 設定、その他の関連変数など、クライアント側の環境変数や構成設定がデータベース接続に影響を与えていないかどうかを確認します。

クライアントライブラリのバージョン

クライアントがデータベース接続に最新バージョンのデータベースドライバー、ライブラリ、またはフレームワークを使用していることを確認します。古いバージョンには、既知の問題や互換性の問題が含まれている可能性があります。

クライアントネットワークキャプチャ

接続の問題の発生時に Wireshark や tcpdump などのツールを使用してクライアント側でネットワークキャプチャを実行します。これにより、クライアント側でネットワーク関連の問題や異常を特定できます。

クライアントネットワークトポロジ

クライアントのネットワークトポロジを構成するファイアウォール、ロードバランサー、その他のコンポーネント (クライアントがデータベースに直接接続せずに、RDS Proxy や Proxy SQL を介して接続する場合など) を理解します。

クライアントオペレーティングシステムの設定

ファイアウォールルール、ネットワークアダプター設定、その他の関連設定など、ネットワーク接続に影響を与える可能性があるクライアントのオペレーティングシステムの設定を確認します。

接続プール設定

アプリケーションで接続プールメカニズムを使用している場合は、構成設定を確認し、プールメトリクス (アクティブな接続、アイドル接続、接続タイムアウトなど) をモニタリングして、プールが正しく機能していることを確認します。また、最大プールサイズ、最小プールサイズ、接続検証設定などのプール設定を参照し、正しく設定されていることを確認します。

接続文字列

接続文字列には、通常、ホスト名やエンドポイント、ポート番号、データベース名、認証情報などのパラメータが含まれます。接続文字列を分析すると、接続問題を引き起こす可能性がある設定ミスや不正な設定を特定するのに役立ちます。例えば、ホスト名やポート番号が間違っていると、クライアントがデータベースインスタンスにアクセスできない場合があります。また、認証情報が無効であると、認証エラーや接続拒否になる可能性があります。さらに、接続文字列から、接続プール、タイムアウト、その他接続問題を起こす可能性がある接続固有の設定に関連する問題が明らかになる場合があります。クライアントアプリケーションで使用する完全な接続文字列を提供することは、クライアントの設定ミスを正確に特定するのに役立ちます。

データベースメトリクス

接続の問題が発生したときに、CPU 使用率、メモリ使用率、ディスク I/O などのデータベースメトリクスをモニタリングします。これらのメトリクスは、DB インスタンスでリソースの競合やパフォーマンスの問題が発生していないかどうかを確認するのに役立ちます。

DB エンジンバージョン

Aurora MySQL DB エンジンのバージョンに注意してください。AWS は、既知の問題やセキュリティの脆弱性に対処し、パフォーマンスの強化をもたらす更新を定期的にリリースしています。したがって、利用可能な最新バージョンにアップグレードすることを強くお勧めします。これらの更新には、接続、パフォーマンス、安定性に特に関連するバグ修正や機能強化が含まれることが多いためです。データベースのバージョン情報やその他の詳細を収集して提供することは、サポートが接続問題を効果的に診断して解決するのに役立ちます。

ネットワークメトリクス

接続の問題が発生したときに、レイテンシー、パケット損失、スループットなどのネットワークメトリクスを収集します。pingtraceroute、ネットワークモニタリングツールなどのツールは、このようなデータの収集に役立ちます。

ソースとクライアントの詳細

データベース接続を開始するアプリケーションサーバー、ロードバランサー、その他のコンポーネントの IP アドレスを確認します。これは、単一の IP アドレスであるか、IP アドレスの範囲 (CIDR 表記) である場合があります。ソースが Amazon EC2 インスタンスの場合、インスタンスタイプ、アベイラビリティーゾーン、サブネット ID、インスタンスに関連付けられたセキュリティグループ、プライベート IP アドレスやパブリック IP アドレスなどのネットワークインターフェイスの詳細を確認することも役立ちます。

収集したデータを徹底的に分析することで、設定ミス、リソースの制約、ネットワークの中断、その他断続的または永続的な接続問題の原因となっている根本的な問題を特定できます。この情報により、設定の調整、ネットワーク問題の解決、アプリケーションレベルの接続処理への対応など、ターゲットを絞ったアクションを実行できます。

Aurora MySQL のデータベース接続のモニタリング

接続問題のモニタリングおよびトラブルシューティングを行うには、以下のメトリクスと機能を使用できます。

CloudWatch メトリクス
  • CPUUtilization – DB インスタンスの CPU 使用率が高いと、クエリの実行が遅くなり、接続のタイムアウトや拒否が発生する可能性があります。

  • DatabaseConnections – DB インスタンスへのアクティブな接続数をモニタリングします。接続数が多く、設定された最大許容数に近いと、接続の問題や接続プールの枯渇につながる可能性を示している場合があります。

  • FreeableMemory – 使用可能なメモリが少ないと、リソースの制約により、パフォーマンスの問題や接続の問題が発生する可能性があります。

  • NetworkReceiveThroughput および NetworkTransmitThroughput – ネットワークスループットの異常な急増や低下は、接続の問題やネットワークのボトルネックを示している可能性があります。

Performance Insights メトリクス

Performance Insights を使用して Aurora MySQL の接続問題のトラブルシューティングを行うには、以下のようなデータベースメトリクスを分析します。

  • Aborted_clients

  • Aborted_connects

  • Connections

  • max_connections

  • Threads_connected

  • Threads_created

  • Threads_running

これらのメトリクスは、接続のボトルネックの特定、ネットワークまたは認証の問題の検出、接続プールの最適化、効率的なスレッド管理の確保に役立ちます。詳細については、「Aurora MySQL の Performance Insights のカウンター」を参照してください。

Performance Insights の機能
  • データベース負荷 – データベース負荷を時間の経過とともに視覚化し、接続の問題やパフォーマンスの低下と関連付けます。

  • SQL 統計 – SQL 統計を分析して、接続問題の原因の可能性がある非効率的なクエリやデータベースオペレーションを特定します。

  • 上位のクエリ – リソース集約度の最も高いクエリを特定して分析します。これにより、接続問題を引き起こしている可能性があるパフォーマンスのボトルネックや長時間実行されているクエリを特定できます。

これらのメトリクスをモニタリングして Performance Insights を活用することで、データベースインスタンスのパフォーマンス、リソースの使用状況、接続問題を引き起こしている可能性があるボトルネックを可視化できます。以下に例を示します。

  • DatabaseConnections が最大許容数に近い場合は、接続プールの枯渇や不適切な接続処理を示しており、接続問題につながる可能性があります。

  • CPUUtilization が高いか、FreeableMemory が低い場合は、リソースの制約を示していることがあり、クエリの実行が遅くなり、接続のタイムアウトや拒否が発生する可能性があります。

  • 上位のクエリSQL 統計を分析すると、接続問題の原因となっている可能性がある非効率的なクエリやリソース集約度の高いクエリを特定するのに役立ちます。

さらに、CloudWatch Logs をモニタリングしてアラームを設定することは、接続問題が深刻化する前に未然に特定して対応するのに役立ちます。

以上のメトリクスやツールは貴重なインサイトを提供できますが、他のトラブルシューティングステップと組み合わせて使用する必要があることに注意してください。ネットワーク設定、セキュリティグループのルール、アプリケーションレベルの接続処理も確認することで、Aurora MySQL DB インスタンスの接続問題を包括的に診断して解決できます。

Aurora MySQL の追加モニタリング

CloudWatch メトリクス
  • AbortedClients – 適切に閉じられていないクライアント接続の数を追跡します。

  • AuroraSlowConnectionHandleCount – 接続問題やパフォーマンスのボトルネックの可能性を示す、接続処理の遅延回数を追跡します。

  • AuroraSlowHandshakeCount – 接続問題の可能性を示している場合もある、低速ハンドシェイクオペレーションの数を測定します。

  • ConnectionAttempts – Aurora MySQL DB インスタンスへの接続試行回数を測定します。

グローバルステータス変数

Aurora_external_connection_count – DB インスタンスへのデータベース接続の数を示します。ただし、データベースのヘルスチェックに使用した RDS サービス接続は除きます。

これらのメトリクスとグローバルステータス変数をモニタリングすることで、Amazon Aurora MySQL インスタンスで接続問題を引き起こしている可能性がある接続パターン、エラー、潜在的なボトルネックを可視化できます。

例えば、AbortedClients または AuroraSlowConnectionHandleCount の数が多い場合は、接続問題を示している可能性があります。

さらに、CloudWatch アラームと通知を設定すると、接続問題が深刻化してアプリケーションのパフォーマンスに影響を与える前に未然に特定して対応できます。

Aurora MySQL の接続エラーコード

Aurora MySQL データベースの一般的な接続エラーおよびエラーコードと説明を以下に示します。

エラーコード 1040: 接続数が多すぎる

このエラーは、データベースサーバーが許可する最大数を超えてクライアントが接続を確立しようとすると発生します。次の原因が考えられます。

  • 接続プールの設定ミス – 接続プールメカニズムを使用している場合は、最大プールサイズの設定が高すぎないこと、および接続が適切にプールに戻されていることを確認します。

  • データベースインスタンス設定 – データベースインスタンスの最大許容接続数の設定を確認し、必要に応じて max_connections パラメータを設定して調整します。

  • 高い同時実行数 – 複数のクライアントやアプリケーションがデータベースに同時に接続している場合、最大許容接続数の制限に達している可能性があります。

エラーコード 1045: ユーザー '...'@'...' に対するアクセス拒否 (パスワードの使用: YES/NO)

このエラーは、データベースに接続しようとして認証に失敗したことを示します。次の原因が考えられます。

  • 認証プラグインの互換性 – クライアントが使用している認証プラグインがデータベースサーバーの認証メカニズムと互換性があるかどうかを確認します。

  • ユーザー名またはパスワードが正しくない – 接続文字列または認証メカニズムで正しいユーザー名とパスワードを使用していることを確認します。

  • ユーザーアクセス許可 – 指定したホストまたはネットワークからデータベースインスタンスに接続するために必要なアクセス許可をユーザーが持っていることを確認します。

エラーコード 1049: 不明なデータベース '...'

このエラーは、クライアントがサーバーに存在しないデータベースに接続しようとしていることを示します。次の原因が考えられます。

  • データベースが作成されていない – 指定したデータベースがデータベースサーバーに作成されていることを確認します。

  • データベース名が正しくない — 接続文字列またはクエリで使用しているデータベース名が正しいことを再確認します。

  • ユーザーアクセス許可 – 指定したデータベースにアクセスするために必要なアクセス許可をユーザーが持っていることを確認します。

エラーコード 1153: 'max_allowed_packet' バイトを超えるパケットを取得した

このエラーは、データベースサーバーが許可する最大パケットサイズを超えるデータをクライアントが送受信しようとすると発生します。次の原因が考えられます。

  • 大量のクエリまたは結果セット – 大量のデータを含むクエリを実行する場合、パケットサイズ制限を超える可能性があります。

  • パケットサイズの設定ミス – データベースサーバーの max_allowed_packet 設定を確認し、必要に応じて調整します。

  • ネットワーク設定の問題 – 必要なパケットサイズがネットワーク設定 (MTU サイズなど) で許可されていることを確認します。

エラーコード 1226: ユーザー '...' が 'max_user_connections' リソースを超えた (現在の値: ...)

このエラーは、データベースサーバーが許可する同時接続の最大数をユーザーが超えたことを示します。次の原因が考えられます。

  • 接続プールの設定ミス – 接続プールメカニズムを使用している場合は、ユーザーの接続制限に対してプールの最大サイズを高すぎないように設定します。

  • データベースインスタンスの設定 — データベースインスタンス max_user_connections 設定を確認し、必要に応じて調整します。

  • 高い同時実行数 – 複数のクライアントやアプリケーションが同じユーザーを使用してデータベースに同時に接続している場合、ユーザー別の接続制限に達している可能性があります。

エラーコード 2003: '...' で MySQL サーバーに接続できない (10061)

このエラーは通常、クライアントがデータベースサーバーとの TCP/IP 接続を確立できない場合に発生します。以下のような、さまざまな問題が原因である可能性があります。

  • データベースインスタンスのステータス – データベースインスタンスが available 状態であり、メンテナンスやバックアップオペレーション中でないことを確認します。

  • ファイアウォールルール – ファイアウォール (オペレーティングシステム、ネットワーク、またはセキュリティグループ) が、指定したポート (MySQL の場合は通常 3306) で接続をブロックしていないかどうかを確認します。

  • ホスト名またはエンドポイントが正しくない — 接続文字列で使用しているホスト名またはエンドポイントが正しいこと、およびデータベースインスタンスと一致していることを確認します。

  • ネットワーク接続の問題 – クライアントマシンがネットワーク経由でデータベースインスタンスにアクセスできることを確認します。ネットワークの停止、ルーティングの問題、VPC またはサブネットの設定ミスがないことを確認します。

エラーコード 2005: 不明な MySQL サーバーホスト '...' (11001)

このエラーは、クライアントがデータベースサーバーのホスト名またはエンドポイントを IP アドレスに解決できない場合に発生します。次の原因が考えられます。

  • DNS 解決の問題 – クライアントマシンが DNS を使用してホスト名を正しく解決できることを確認します。DNS 設定、DNS キャッシュを確認し、ホスト名の代わりに IP アドレスを使用してみます。

  • ホスト名またはエンドポイントが正しくない — 接続文字列で使用しているホスト名またはエンドポイントが正しいことを再確認します。

  • ネットワーク設定の問題 – クライアントのネットワーク設定 (VPC、サブネット、ルートテーブルなど) で、DNS 解決とデータベースインスタンスへの接続が許可されていることを確認します。

エラーコード 2026: SSL 接続エラー

このエラーは、接続の試行中に SSL/TLS 設定または証明書の検証に問題がある場合に発生します。次の原因が考えられます。

  • 証明書の有効期限 – サーバーで使用している SSL/TLS 証明書が期限切れで更新する必要があるかどうかを確認します。

  • 証明書の検証の問題 – クライアントがサーバーの SSL/TLS 証明書を正しく検証できること、および証明書が信頼できることを確認します。

  • ネットワーク設定の問題 – ネットワーク設定で SSL/TLS 接続が許可されており、SSL/TLS ハンドシェイクプロセスがブロックまたは干渉されていないことを確認します。

  • SSL/TLS 設定の不一致 – クライアントとサーバーの SSL/TLS 設定 (暗号スイートやプロトコルバージョンなど) に互換性があることを確認します。

各エラーコードの詳細な説明と潜在的な原因を理解することで、Aurora MySQL データベースを使用する際の接続問題をより適切にトラブルシューティングして解決できます。

Aurora MySQL のパラメータチューニングの推奨事項

最大接続数

これらのパラメータを調整すると、最大許容接続数に達したために発生する接続問題を防止できます。これらの値がアプリケーションの同時実行の要件とリソースの制約に基づいて適切に設定されていることを確認します。

  • max_connections – このパラメータは、DB インスタンスに許可される同時接続の最大数を指定します。

  • max_user_connections – このパラメータは、ユーザーの作成時や変更時に指定でき、特定のユーザーアカウントに許可される同時接続の最大数を設定します。

ネットワークバッファサイズ

これらの値を増やすと、特に大規模なデータ転送や結果セットを伴うワークロードの場合、ネットワークパフォーマンスを向上させることができます。ただし、バッファサイズが大きいほどメモリ消費量も増える可能性があるので、注意してください。

  • net_buffer_length – このパラメータは、クライアント接続と結果バッファの初期サイズを設定し、メモリ使用量とクエリパフォーマンスのバランスを取ります。

  • max_allowed_packet – このパラメータは、DB インスタンスが送受信できる単一のネットワークパケットの最大サイズを指定します。

ネットワーク圧縮 (クライアント側)

ネットワーク圧縮を有効にすると、ネットワーク帯域幅の使用量を減らすことができますが、クライアント側とサーバー側の両方で CPU オーバーヘッドが増加する可能性があります。

  • compress – このパラメータは、クライアント/サーバー通信のネットワーク圧縮を有効または無効にします。

  • compress_protocol – このパラメータは、ネットワーク通信に使用する圧縮プロトコルを指定します。

ネットワークパフォーマンスのチューニング

これらのタイムアウトを調整すると、アイドル状態の接続を管理し、リソースの枯渇を防ぐのに役立ちますが、値が低いと接続が早期に終了する可能性があるため、注意が必要です。

  • interactive_timeout – このパラメータは、サーバーがインタラクティブ接続でアクティビティを待機し始めてから接続を閉じるまでの秒数を指定します。

  • wait_timeout – このパラメータは、サーバーが非インタラクティブ接続でアクティビティを待機し始めてから接続を閉じるまでの秒数を決定します。

ネットワークタイムアウト設定

これらのタイムアウトを調整すると、接続の遅延や応答不良に関連する問題に対処できます。ただし、設定を短くしすぎると、接続が早期に失敗する可能性があるため、注意してください。

  • net_read_timeout – このパラメータは、読み取りオペレーションを終了するまでに、接続からの追加データを待機する秒数を指定します。

  • net_write_timeout – このパラメータは、書き込みオペレーションを終了するまでに、ブロックが接続に書き込まれるのを待機する秒数を決定します。

Aurora MySQL のデータベース接続問題のトラブルシューティングの例

以下の例は、Aurora MySQL のデータベース接続問題を特定してトラブルシューティングを行う方法を示しています。

例 1: 失敗した接続試行のトラブルシューティング

接続の試行は、認証の失敗、SSL/TLS ハンドシェイクの失敗、max_connections 制限の到達、DB インスタンスでのリソース制約など、いくつかの理由で失敗する可能性があります。

失敗した接続の数は、Performance Insights または次のコマンドを使用して追跡できます。

mysql> show global status like 'aborted_connects'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | Aborted_connects | 7 | +------------------+-------+ 1 row in set (0.00 sec)

Aborted_connects の数が時間とともに増える場合、アプリケーションに断続的な接続の問題があることが考えられます。

Aurora の高度な監査機能を使用して、クライアント接続の接続数と切断数をログ記録できます。これを行うには、DB クラスターパラメータグループで以下のパラメータを設定します。

  • server_audit_logging = 1

  • server_audit_events = CONNECT

次に示すのは、失敗したログインの監査ログからの抜粋です。

1728498527380921,auora-mysql-node1,user_1,172.31.49.222,147189,0,FAILED_CONNECT,,,1045 1728498527380940,auora-mysql-node1,user_1,172.31.49.222,147189,0,DISCONNECT,,,0

コードの説明は以下のとおりです。

  • 1728498527380921 — ログイン失敗が発生したときのエポックタイムスタンプ

  • aurora-mysql-node1 – 接続が失敗した Aurora MySQL クラスターのノードのインスタンス識別子

  • user_1 — ログインが失敗したデータベースユーザーの名前

  • 172.31.49.222 – 接続を確立したクライアントのプライベート IP アドレス

  • 147189 – 失敗したログインの接続 ID

  • FAILED_CONNECT – 接続が失敗したことを示します。

  • 1045 – リターンコード。ゼロ以外の値はエラーを示します。この場合、1045 はアクセス拒否に対応します。

詳細については、MySQL ドキュメントの「サーバーエラーコード」と「クライアントエラーコード」を参照してください。

また、Aurora MySQL エラーログを調べて、次のような関連するエラーメッセージを確認することもできます。

2024-10-09T19:26:59.310443Z 220 [Note] [MY-010926] [Server] Access denied for user 'user_1'@'172.31.49.222' (using password: YES) (sql_authentication.cc:1502)

例 2: 異常なクライアント切断のトラブルシューティング

Performance Insights または次のコマンドを使用して、異常なクライアント切断の数を追跡できます。

mysql> show global status like 'aborted_clients'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Aborted_clients | 9 | +-----------------+-------+ 1 row in set (0.01 sec)

Aborted_clients の数が時間とともに増える場合、アプリケーションはデータベースへの接続を正しく閉じていません。接続が適切に閉じられていないと、リソースのリークやパフォーマンスの問題が発生する可能性があります。接続を不必要に開いたままにすると、メモリやファイル記述子などのシステムリソースが消費され、最終的にはアプリケーションやサーバーが応答しなくなるか再起動する可能性があります。

次のクエリを使用して、接続を適切に閉じていないアカウントを特定できます。このクエリは、ユーザーアカウント名、ユーザーの接続元のホスト、閉じていない接続の数、閉じていない接続の割合を取得します。

SELECT ess.user, ess.host, (a.total_connections - a.current_connections) - ess.count_star AS not_closed, (((a.total_connections - a.current_connections) - ess.count_star) * 100) / (a.total_connections - a.current_connections) AS pct_not_closed FROM performance_schema.events_statements_summary_by_account_by_event_name AS ess JOIN performance_schema.accounts AS a ON (ess.user = a.user AND ess.host = a.host) WHERE ess.event_name = 'statement/com/quit' AND (a.total_connections - a.current_connections) > ess.count_star; +----------+---------------+------------+----------------+ | user | host | not_closed | pct_not_closed | +----------+---------------+------------+----------------+ | user1 | 172.31.49.222 | 1 | 33.3333 | | user1 | 172.31.93.250 | 1024 | 12.1021 | | user2 | 172.31.93.250 | 10 | 12.8551 | +----------+---------------+------------+----------------+ 3 rows in set (0.00 sec)

接続を閉じていないユーザーアカウントとホストを特定したら、接続を正常に閉じていないコードのチェックに進むことができます。

例えば、Python の MySQL コネクタでは、接続オブジェクトの close() メソッドを使用して接続を閉じます。データベースへの接続を確立して、クエリを実行し、接続を閉じる関数の例を次に示します。

import mysql.connector def execute_query(query): # Establish a connection to the database connection = mysql.connector.connect( host="your_host", user="your_username", password="your_password", database="your_database" ) try: # Create a cursor object cursor = connection.cursor() # Execute the query cursor.execute(query) # Fetch and process the results results = cursor.fetchall() for row in results: print(row) finally: # Close the cursor and connection cursor.close() connection.close()

この例では、例外が発生するかどうかにかかわらず、connection.close() メソッドを finally ブロックで呼び出して接続が閉じられていることを確認しています。