背景日常の使用において、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デザイン: スクリプト素材でユーザーエクスペリエンスを再構築
目次1. querySelectorは単一の要素を照会する1. ドキュメントインスタンスの呼び出し2...
Awk は、ソートを含む他の一般的なユーティリティによって実行できるいくつかのタスクを実行できる強...
目次序文:システム要件:インストール環境:古いバージョンをアンインストールします: yum は具体的...
今日はMySQLのインストール方法を学びましたが、その過程でいくつか問題が発生しました。関連記事をい...
以前の開発では、クラス、名前などの HTML のデフォルト属性を使用していました。 Huawei社の...
MySQL の MyISAM エンジンと InnoDB エンジンはどちらもデフォルトで B+ ツリー...
Windows システムに仮想マシンをインストールするには、 VMware Workstationソ...
目次前面に書かれた1. Ngixnイメージの作成2. Java Web (Tomcat) アプリケー...
前回の記事では、docker compose を使用して FastDfs ファイル サーバーをインス...
関数0. 現在の時刻を表示するコマンド: select now()。機能: 現在の時刻を表示します。...
以前は、角を丸くするのは非常に面倒でしたが、CSS3 では、角を丸くするのは非常に簡単になり、bor...
目次1. 事前分析1. 変数の事前解析と関数の事前解析1. 変数の事前解析2. 機能事前分析2. 事...
Vue2+elementui のホバー プロンプトは、外部と内部に分かれています。内部のものは el...
ウェブサイトのナビゲーションを設計することは、家の基礎を築くようなものです。基礎がしっかりしていなけ...
私はかなり昔に CSS に触れましたが、フローティングについてはいつも混乱していました。私の理解が浅...