MySQL の厄介な Aborted 警告をケーススタディで分析する

MySQL の厄介な Aborted 警告をケーススタディで分析する

この記事では主に、MySQL の Aborted アラームに関する関連コンテンツを紹介し、参考と学習のために共有します。詳細な紹介を見てみましょう。

実際の戦闘

パート1: 冒頭に書いた

MySQL エラー ログには、さまざまな種類の「接続中止」エラーがよく見られます。この記事では、このようなエラーの予備分析を行い、問題が発生した後の基本的なトラブルシューティングの考え方と方法を説明します。問題が発生したときに推測して試すのではなく、この方法を習得することが重要です。データベースに問題が発生した場合、DBA は短期間で迅速に問題を解決する必要があります。したがって、優れた DBA と劣った DBA の違いはここにあります。

パート2: タイプ

[警告] db: 'db'、ユーザー: 'dbuser'、ホスト: 'hostname' への接続 305628 が中止されました (通信パケットの読み取り中にエラーが発生しました)
[警告] db:'unconnected' への接続 81 が中止されました。ユーザー: 'root'、ホスト: '127.0.0.1' (通信の読み取りタイムアウトが発生しました)
パケット)
[警告] db:'helei1' ユーザー: 'sys_admin' ホスト: '192.168.1.1' への接続 109 が中止されました (通信パケットの書き込み中にエラーが発生しました)
[警告] ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用: YES)
[警告] 通信パケットの書き込み中にエラーが発生しました

パート3: 主要パラメータ分析

待機タイムアウト

コマンドライン形式--wait-timeout=#
システム変数名前待機タイムアウト
変数のスコープグローバル、セッション
動的変数はい
許可される値(Windows)タイプ整数
デフォルト28800
最小値1
最大値2147483
許可される値(その他)タイプ整数
デフォルト28800
最小値1
最大値31536000

このパラメータは、サーバーが非対話型接続をシャットダウンする前にアクティビティを待機する秒数を指定します。

インタラクティブタイムアウト

コマンドライン形式--インタラクティブタイムアウト=#
システム変数名前インタラクティブタイムアウト
変数のスコープグローバル、セッション
動的変数はい
許容値タイプ整数
デフォルト28800
最小値1

このパラメータは、対話型接続を閉じる前にサーバーがアクティビティを待機する秒数を指定します。

警告:落とし穴を避けるために、これら 2 つのパラメータを一緒に調整することをお勧めします。

この記事の2つのパラメータ値はデフォルト値を使用しています

mysql> '%timeout%' のようなグローバル変数を表示します。
+----------------------------+----------+
| 変数名 | 値 |
+----------------------------+----------+
| 接続タイムアウト | 10 |
| 遅延挿入タイムアウト | 300 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | オフ |
|インタラクティブタイムアウト | 28800 |
| ロック待機タイムアウト | 31536000 |
| ネット読み取りタイムアウト | 30 |
| ネット書き込みタイムアウト | 60 |
| スレーブネットタイムアウト | 3600 |
|待機タイムアウト | 28800 |
+----------------------------+----------+
セット内の行数は 10 行 (0.01 秒)

さらに、データベースでは、これらの2つのパラメータに注目して、どのような状況でAborted_clientsが増加し、どのような状況でAborted_connectsが増加するかを確認します。

mysql> 'aborted%' のようなグローバル ステータスを表示します。
+------------------+-------+
|変数名 | 値 |
+------------------+-------+
|中止されたクライアント | 19 |
|Aborted_connects | 0 |
+------------------+-------+
2行インセット(0.00秒)

パート4: ケース1

ここで、データベースエラーログのどのパラメータがこの問題を記録するかを確認するために、意図的に5回間違ったパスワードを入力しました。

[root@HE3~]# mysql -uroot -pwrongpass -h127.0.0.1
エラー 1045 (28000): ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用: YES)
[root@HE3~]# mysql -uroot -pwrongpass -h127.0.0.1
エラー 1045 (28000): ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用: YES)
[root@HE3~]# mysql -uroot -pwrongpass -h127.0.0.1
エラー 1045 (28000): ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用: YES)
[root@HE3~]# mysql -uroot -pwrongpass -h127.0.0.1
エラー 1045 (28000): ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用: YES)
[root@HE3~]# mysql -uroot -pwrongpass -h127.0.0.1
エラー 1045 (28000): ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用: YES)

ここでのAborted_connectsは間違ったパスワードの問題を記録していることがわかります。

mysql> 'aborted%' のようなグローバル ステータスを表示します。
+------------------+-------+
|変数名 | 値 |
+------------------+-------+
|中止されたクライアント | 19 |
|接続が中止されました | 5 |
+------------------+-------+
2行インセット(0.00秒)

エラーログには、このタイプのパスワード入力エラー情報も記録されます。

[警告] ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用: YES)
[警告] ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用:YES)
[警告] ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用:YES)
[警告] ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用:YES)
[警告] ユーザー 'root'@'127.0.0.1' のアクセスが拒否されました (パスワード使用:YES)

パート5: ケース2

次に、セクション 3 で説明した 2 つの主要なパラメータがデータベース接続の動作に与える影響を見てみましょう。

ここでは両方のパラメータを10秒に設定します

mysql>グローバルwait_timeoutを10に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
 
mysql>グローバルinteractive_timeoutを10に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql>プロセスリストを表示します。
エラー 2006 (HY000): MySQL サーバーが消えました
接続がありません。再接続を試行しています... 接続 ID: 79 現在のデータベース: *** なし ***
 
+----+------+-----------------+-------+--------+-------+-------+------------------+
| ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 |
+----+------+-----------------+-------+--------+-------+-------+------------------+
| 79 |root | 127.0.0.1:42016 | NULL | クエリ | 0 | NULL | プロセスリストを表示 |
+----+------+-----------------+-------+--------+-------+-------+------------------+
セット内の 1 行 (0.00 秒)

ここに 3 つの操作があります。クライアントの数が増加していることがわかります。これは、タイムアウト パラメータによって、すでにデータに接続している接続が制御され、強制終了されるためです。

mysql> 'aborted%' のようなグローバル ステータスを表示します。
エラー 2006 (HY000): MySQL サーバーが消えました
接続がありません。再接続を試行しています... 接続 ID: 81 現在のデータベース: *** なし ***
 
+------------------+-------+
|変数名 | 値 |
+------------------+-------+
|中止されたクライアント | 22 |
|接続が中止されました | 5 |
+------------------+-------+
セットに2行(0.01秒)

エラーログには、

[警告] db への接続 81 が中止されました: 'unconnected' ユーザー: 'root' ホスト: '127.0.0.1' (通信パケットの読み取り中にタイムアウトが発生しました)
[警告] db への接続 78 が中止されました: 'unconnected' ユーザー: 'root' ホスト: '127.0.0.1' (通信パケットの読み取り中にタイムアウトが発生しました) 
[警告] db への接続 79 が中止されました: 'unconnected' ユーザー: 'root' ホスト: '127.0.0.1' (通信パケットの読み取り中にタイムアウトが発生しました)

パート6: ケース3

この場合、最大接続数がデータベース接続の動作に与える影響を調べます。

mysql> 'max_conn%' のようなグローバル変数を表示します。
+--------------------+-------+
|変数名 | 値 |
+--------------------+-------+
|最大接続エラー数 | 1000 |
|最大接続数 | 1024 |
+--------------------+-------+
セット内の 2 行 (0.00 秒)
 
 
mysql>グローバルmax_connectionsを2に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

ここで、接続が多すぎるという問題が発生していることがわかります。

[root@HE3~]# mysql -uroot -pMANAGER -h127.0.0.1
エラー 1040 (HY000): 接続が多すぎます

エラーログに記録がありません

パート7: ケース4

サードパーティツールのNavicat Selectの結果が出ない場合は、停止を選択すると表示されます。

クライアントの増加

mysql> 'aborted%' のようなグローバル ステータスを表示します。
+------------------+-------+
|変数名 | 値 |
+------------------+-------+
|中止されたクライアント | 28 |
|接続が中止されました | 10 |
+------------------+-------+
セット内の 2 行 (0.00 秒)

エラーログの記録

170626 16:26:56 [警告] db: 'helei1'、ユーザー: 'sys_admin'、ホスト: '192.168.1.1' への接続 109 が中止されました (通信パケットの書き込み中にエラーが発生しました)

第8部: 理由の要約

  1. MySQL で接続が数百秒間スリープ状態になり、それが頻繁に繰り返されるのは、アプリケーションが作業後に接続を閉じず、データベースの wait_timeout に依存して接続を閉じていることの症状の 1 つです。操作の終了時に接続を適切に閉じるようにアプリケーション ロジックを変更することを強くお勧めします。
  2. max_allowed_pa​​cket の値が十分に高いこと、およびクライアントが「パケットが大きすぎます」というメッセージを受信しないことを確認します。 この場合、接続を適切に閉じるのではなく、接続を中止します。
  3. もう 1 つの可能性は TIME_WAIT です。アプリケーション側で接続が適切に管理され、適切に閉じられていることを確認することをお勧めします。
  4. トランザクションが正しくコミット (開始およびコミット) され、アプリケーションが接続を「完了」すると「クリーン」な状態になることを確認します。
  5. クライアント アプリケーションが接続を中止しないようにする必要があります。 たとえば、PHP のオプション max_execution_time が 5 秒に設定されている場合、PHP がスクリプトを強制終了するため、connect_timeout を増やしても意味がありません。 他のプログラミング言語や環境にも同様のオプションがあります。
  6. 接続遅延のもう一つの原因は DNS の問題です。 skip-name-resolve が有効になっているかどうかを確認します。これにより、ホストがホスト名ではなく IP アドレスに基づいて認証されているかどうかがチェックされます。
  7. MySQL の net_read_timeout と net_write_timeout の値を増やして、エラーの数が減るかどうかを確認してください。

要約する

これら 4 つのケースを通じて、Aborted_clients と Aborted_connects の違い、およびどのような状況でどのようなエラー ログが表示されるかを理解できます。記事の 2 番目のセクションにあるいくつかの Aborted エラーは一般的なエラーです。このようなエラーが発生した場合は、問題を迅速に特定できるように、どのような状況でどのようなエラーが発生するかを知るための理論的な知識を念頭に置いておく必要があります。著者の能力の限界と記事執筆の急ぎにより、記事には必然的に誤りや不正確な点があります。不適切な点がありましたら、読者の皆様のご批判と訂正を心からお願い申し上げます。

さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に少しでもお役に立てれば幸いです。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただき、ありがとうございます。

以下もご興味があるかもしれません:
  • MYSQL SERVER のログファイルを縮小する方法
  • MySQL の一般的なログの概要
  • MySQLトランザクションとMySQLログの詳細な説明
  • MySQL Binlog ログの読み取り時によくある 3 つのエラー
  • MySQL でスロークエリログ機能を有効にする方法
  • mysql binlog (バイナリログ) を表示する方法
  • MySQL スロークエリログの基本的な使い方チュートリアル
  • grep を使用して MySQL エラー ログ情報を取得する方法の詳細な説明
  • MySQL 中断された接続警告ログの分析

<<:  JavaScript を使用して二分探索木を実装する方法

>>:  Windows での Apache+Tomcat7 負荷分散構成方法の詳細な説明

推薦する

円形グラデーションプログレスバー効果を実現する CSS サンプルコード

実装のアイデア一番外側は大きな円(グラデーションカラー)グラデーションの円を覆うように、内側に半円を...

Linux アカウントのパスワードを変更する詳細な例

個人アカウントのパスワードを変更する一般ユーザーが個人アカウントのパスワードを変更する場合は、他のコ...

MySQL で 2 つのテーブルをクエリする場合の from と join の違いの概要

序文MySQL では、複数テーブル結合クエリは非常に一般的な要件です。複数テーブルクエリを使用する場...

CentOS 7 で yum を使用して MySQL 5.7.20 をインストールする最も簡単な方法

CentOS7 のデフォルトのデータベースは mariadb ですが、mysql を使っている人も多...

Windows 環境での MYSQL5.7 設定ファイルの場所のグラフィカル分析

1. MYSQLインストールディレクトリ次のようにコードをコピーします。 select @@bas...

CSS3 アニメーション – ステップ機能の説明

最近、CSS3 アニメーションのソース コードの実装をいくつか見ていたところ、CSS コード アニメ...

PHP-HTMLhtml 重要な知識ポイントメモ(必読)

1. フレームセット、フレーム、iframeを使用して複数のウィンドウを実現する2. 画像上のマッ...

MySQL での find_in_set() 関数の使用に関する詳細な説明

まず、例を見てみましょう。記事テーブルにはタイプフィールドがあり、1 見出し、2 おすすめ、3 ホッ...

VSCode 構成 Git メソッドの手順

Git は vscode に統合されており、git コマンドをいくつか記述しなくても、クリックするだ...

GitHub のサードパーティ認証方式を Vue で実装する例

目次OAuth アプリの作成コードを取得するaccess_tokenを取得するユーザー情報を取得する...

Vue で PC アドレスをモバイル アドレスにリダイレクトする方法

要件:PC側とモバイル側は2つの独立したプロジェクトです。2つのプロジェクトの内容は基本的に同じで、...

MySQLデータベースで列を追加、削除、変更する方法

この記事では、例を使用して、MySQL データベースの列を追加、削除、および変更する方法について説明...

フィールドの文字セットの違いによる MySQL のインデックス失敗の解決策

インデックスとは何ですか?なぜインデックスを作成するのですか?インデックスは、列に特定の値を持つ行を...

SVN のインストールと基本操作 (グラフィック チュートリアル)

目次1. SVNとは何か2. SVNサーバーとクライアントの取得方法3. SVN ワークフローとアー...