背景日常の使用において、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デザイン: スクリプト素材でユーザーエクスペリエンスを再構築
操作効果: html <div class="三目並べ"> <...
エフェクトのスクリーンショット:実装コード:コードをコピーコードは次のとおりです。 <!DOC...
MySQL データベース テーブルでは、インデックスを作成、表示、再構築、削除できるため、クエリ速度...
長い間ウェブサイトを作ってきましたが、入力時のnameとidの違いがまだわかりません。最近jQuer...
概要実際のビジネス シナリオ アプリケーションでは、ビジネス条件に基づいて対象データを取得およびフィ...
MySQL データベースの作成MySQL サービスにログインしたら、create コマンドを使用し...
目次mysql 権限制御権限システムテーブル変更後にMySQLの権限を有効にする方法権限の付与と取り...
Gird レイアウトは Flex レイアウトといくつかの類似点があり、どちらもコンテナーの内部項目を...
複雑な表を作成するには HTML を使用します。複雑なテーブルでは通常、td の rowspan 属...
目次1. マージインターフェース1.1 非関数メンバー1.2 関数メンバー序文:今日お話ししたいのは...
クリックされたボタンには赤い画像スタイルを実装し、選択されていない他のボタンには灰色の画像スタイルを...
序文あるプロジェクトの実行可能ファイルをインストールすると、MySQL 自体をインストールできるよう...
1. SVNサーバーをインストールする yum でサブバージョンをインストール2. SVNバージョン...
この記事では、例を使用して MySQL トリガーの構文とアプリケーションを説明します。ご参考までに、...
一緒に学びましょう1. 伝統的な方法コードをコピーコードは次のとおりです。 <object c...