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 負荷分散構成方法の詳細な説明

推薦する

WeChatアプレットは画像コントロールを選択します

この記事の例では、WeChatアプレットで画像コントロールを選択するための具体的なコードを参考までに...

jsフェッチ非同期リクエストの使用の詳細な例

目次非同期を理解するフェッチ(url)レスポンス.json() asyncとawaitを組み合わせる...

CSS は Google マテリアル デザインのテキスト入力ボックス スタイルを実装します (推奨)

みなさんこんにちは。今日は、純粋な CSS を使用して Google マテリアル デザインのテキスト...

WeChatアプレットで画像の幅と高さを取得する方法

起源最近、私は要件 A に取り組んでいます。そこには、次のように記述される小さな機能ポイントがありま...

フロントエンド開発における一般的なテクニックのまとめ

1. 記事タイトルリストの右側に日付を表​​示する方法:コードをコピーコードは次のとおりです。 &l...

Vue ショッピングカートのケーススタディ

目次1. ショッピングカートの例2. コードの実装3. まとめ1. ショッピングカートの例一連の学習...

webpackでHMRを手動で実装するいくつかの方法

目次1. はじめに2. GitHub 3. 基本構成プロジェクトディレクトリパッケージ.json c...

mysql8.0.18 で winx64 をインストールするための詳細なチュートリアル (画像とテキスト付き)

MySQLデータベースをダウンロードするには、https://dev.mysql.com/down...

Tomcat は、Springboot プロジェクトの WAR パッケージの起動時にエラーを報告します: 子の起動時にエラーが発生しました

今日、会社の Springboot プロジェクトは、テストのためにテスト サーバーにデプロイする準備...

Django は Pillow を使用して検証コード機能を簡単に設定します (Python)

1. モジュールをインポートし、検証状態を定義する PIL から Image、ImageDraw、...

Vueシャトルボックスは上下の動きを実現します

この記事の例では、vueシャトルボックスを上下に動かすための具体的なコードを参考までに共有しています...

CentOS7 での PostgreSQL 11 の詳細なインストールと設定のチュートリアル

1. 公式ウェブサイトアドレス公式サイトではインストールの参考手順が紹介されています。公式サイトを見...

Linux FTP匿名アップロードとダウンロードが自動的に開始される問題を解決する

勉強や仕事で FTP サーバーを頻繁に使用する場合は、起動時に自動的に起動するように設定できます。設...

MySQL テーブルスペースとは何ですか?

今日皆さんにお伝えしたいトピックは、「皆さんがよく話題にするテーブル スペースとは一体何でしょうか。...

HTML 5.1 学習: 14 の新機能とアプリケーション例

序文ご存知のとおり、HTML5 はインターネット コミュニティ全体に標準を提供する組織である Wor...