背景日常の使用において、MySQL で個別または大量の接続が蓄積されることが時々あります。このような場合、通常は、kill コマンドを使用してこれらの蓄積された接続を強制的に強制終了し、接続数とデータベース サーバーの CPU リソースをできるだけ早く解放することを検討します。 問題の説明実際に kill コマンドを使用すると、接続はすぐには終了せず、プロセス リストにはまだ表示されますが、表示されるコマンドは一般的なクエリや実行ではなく、Killed になります。例えば: mysql> プロセスリストを表示します。 +----+------+--------------------+---------+--------+------+--------------+--------------------------------+ | ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 | +----+------+--------------------+---------+--------+------+--------------+--------------------------------+ | 31 | root | 192.168.1.10:50410 | sbtest | クエリ | 0 | 開始 | プロセスリストを表示 | | 32 | root | 192.168.1.10:50412 | sbtest | クエリ | 62 | ユーザー sleep | select sleep(3600) from sbtest1 | | 35 | root | 192.168.1.10:51252 | sbtest | 強制終了 | 47 | データ送信中 | select sleep(100) from sbtest1 | | 36 | root | 192.168.1.10:51304 | sbtest | クエリ | 20 | データを送信中 | select sleep(3600) from sbtest1 | +----+------+--------------------+---------+--------+------+--------------+--------------------------------+ 原因分析疑問がある場合は、まず公式ドキュメントを参照してください。以下は公式ドキュメントからの抜粋です。
公式ドキュメントの最初の段落には、kill のメカニズムが明確に記載されています。接続されたスレッドに対してスレッド レベルの kill マークが設定され、次の「マーク検出」まで有効になりません。これは、次の「マーク検出」が間に合わなかった場合、問題で説明した現象が発生する可能性があることも意味します。 公式ドキュメントには、いくつかのシナリオがリストされています。公式の説明に基づいた、よくある問題のシナリオをいくつか示します。
シミュレーションするここでは、パラメータ innodb_thread_concurrency を使用して、SQL ステートメントの通常の実行をブロックするシナリオをシミュレートします。 InnoDB 内で許可されるスレッドの最大数を定義します。値 0 (デフォルト) は、無制限の同時実行 (制限なし) として解釈されます。この変数は、高同時実行システムでのパフォーマンス チューニングを目的としています。 公式ドキュメントによると、このパラメータが低い値に設定されている場合、制限を超える InnoDB クエリはブロックされます。したがって、このシミュレーションでは、このパラメータは非常に低い値に設定されました。 mysql> '%innodb_thread_concurrency%' のような変数を表示します。 +---------------------------+-------+ | 変数名 | 値 | +---------------------------+-------+ | innodb_thread_concurrency | 1 | +---------------------------+-------+ セット内の 1 行 (0.00 秒) 次に、2 つのデータベース接続 (セッション 1 とセッション 2) を開き、それぞれで セッション 1: mysql> sbtest.sbtest1 から sleep(3600) を選択します。 セッション2: mysql> sbtest.sbtest1 から sleep(3600) を選択します。 エラー 2013 (HY000): クエリ中に MySQL サーバーへの接続が失われました マイSQL> セッション3: mysql> プロセスリストを表示します。 +----+------+--------------------+-------+--------+------+--------------+-----------------------------------------+ | ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 | +----+------+--------------------+-------+--------+------+--------------+-----------------------------------------+ | 44 | root | 172.16.64.10:39290 | NULL | クエリ | 17 | ユーザー sleep | sbtest.sbtest1 から sleep(3600) を選択 | | 45 | ルート | 172.16.64.10:39292 | NULL | クエリ | 0 | 開始 | プロセスリストを表示 | | 46 | root | 172.16.64.10:39294 | NULL | クエリ | 5 | データを送信中 | select sleep(3600) from sbtest.sbtest1 | +----+------+--------------------+-------+--------+------+--------------+-----------------------------------------+ セット内の 3 行 (0.00 秒) mysql> 46 を強制終了します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> プロセスリストを表示します。 +----+------+--------------------+-------+--------+------+--------------+-----------------------------------------+ | ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 | +----+------+--------------------+-------+--------+------+--------------+-----------------------------------------+ | 44 | root | 172.16.64.10:39290 | NULL | クエリ | 26 | ユーザー sleep | sbtest.sbtest1 から sleep(3600) を選択 | | 45 | ルート | 172.16.64.10:39292 | NULL | クエリ | 0 | 開始 | プロセスリストを表示 | | 46 | root | 172.16.64.10:39294 | NULL | 強制終了 | 14 | データを送信中 | sbtest.sbtest1 から sleep(3600) を選択 | +----+------+--------------------+-------+--------+------+--------------+-----------------------------------------+ セット内の 3 行 (0.00 秒) マイSQL> ご覧のとおり、kill コマンドが実行されると、セッション 2 の接続はすぐに切断されますが、セッション 2 によって開始されたクエリは MySQL に残っています。もちろん、 総括するMySQL の kill 操作は、想像どおりにデータベース接続を直接強制的に終了するわけではありません。終了信号を送信するだけです。SQL 自体の実行効率が遅すぎる場合、または他の要因 (サーバーの負荷が高い、大量のデータ ロールバックがトリガーされる) の影響を受けている場合は、この kill 操作では、問題のあるクエリを時間内に終了できない可能性があります。それどころか、プログラム側の接続が切断された後に再接続がトリガーされ、クエリの効率がさらに低下し、データベースのパフォーマンスがさらに低下する可能性があります。 上記は、MySQL kill がスレッドを強制終了できない理由の詳細です。MySQL kill スレッドの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Webデザイン: スクリプト素材でユーザーエクスペリエンスを再構築
背景アプリケーション システムの数が増え続けると、当初はアラームを発していなかったアクティブ スレッ...
<br />どの家庭にもそれぞれの問題があり、改訂はどの IT 企業にとっても問題の 1...
目次1 テストケース2 JS配列重複排除4種類2.1 要素の比較2.1.1 二重層 for ループ比...
MySQL のイベント スケジューラ EVENT は、Unix crontab や Windows ...
React コンポーネントのライフサイクル機能とは何ですか?ライフサイクル関数は、ES6 構文クラス...
あなたも私と同じように、コンピューターのファイルを整然と整理し、不要なファイルを適宜削除するプログラ...
Linux 上の LibreOffice で Microsoft ドキュメントを開くと、フォントが少...
ps: 環境はタイトル通りです依存関係をインストールする yum インストール openssl-de...
最初のステップは、MySQL 8.0.23の無料インストールバージョンをダウンロードすることです。 ...
自動プロジェクト展開は大企業やユニコーン企業でよく使用され、手動でプロジェクトを展開するよりも効率的...
準備1. マスターとスレーブのデータベースのバージョンは一致している必要があります2. マスターデー...
フロントエンドとバックエンドがやり取りする場合、get または delete を介してバックエンドに...
ディスプレイ定義IDテーブルに定義された自動増分IDが上限に達した場合、次のIDを申請する際に得られ...
序文基本的に、職場のプログラマーは、count(*)、count(1)、または count(prim...
テキストシャドウテキストに影を追加します。テキストとテキスト装飾に複数のシャドウを追加することができ...