MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで実行中のクエリを停止する方法|プロセス確認からKILLまで徹底解説

MySQLで長時間実行されているクエリや暴走しているクエリを放置すると、サーバーのパフォーマンスに深刻な影響を与えます。本記事では、実行中のクエリを安全に特定し、停止させる具体的な手順を解説します。

STEP 1:実行中のプロセスを確認する

クエリを停止する前に、まずSHOWコマンドで現在稼働中のプロセス一覧を確認しましょう。使用するクエリは以下の通りです。

mysql> SHOW PROCESSLIST;

このクエリを実行すると、各接続に割り当てられたIDを含む一覧が出力されます。

+----+-----------------+-----------------+----------+---------+-------+------------------------+------------------+
| Id | User            | Host            | db       | Command | Time  | State                  | Info             |
+----+-----------------+-----------------+----------+---------+-------+------------------------+------------------+
| 4  | event_scheduler | localhost       | NULL     | Daemon  | 71034 | Waiting on empty queue | NULL             |
| 8  | Manish          | localhost:53496 | business | Query   | 0     | starting               | show processlist |
+----+-----------------+-----------------+----------+---------+-------+------------------------+------------------+
2 rows in set (0.00 sec)

出力結果を見ると、現在使用中のデータベースは「business」であり、その接続IDは8であることがわかります。このIDが、後ほどクエリを停止する際のキーとなります。

STEP 2:rds_killでクエリを停止する

クエリを停止するには、プロセスリストに表示されたIDを指定してCALLコマンドを実行します。基本の構文は以下の通りです。

CALL mysql.rds_kill(停止したいプロセスのID);

それでは、実際にIDとして8を指定して実行してみましょう。

mysql> CALL mysql.rds_kill(8);

このクエリを実行すると、次のような出力が得られます。

ERROR 2013 (HY000): Lost connection to MySQL server during query

このエラーが表示されても慌てる必要はありません。これは対象の接続・クエリが正常に停止されたことによるもので、意図した通りの動作です。

STEP 3:クエリが停止したことを確認する

本当にクエリが停止したかどうかを確認するには、USEコマンドでデータベースへの再接続を試みます。構文は以下の通りです。

USE データベース名;

ここでは、システム上のデータベース「business」に対して実行します。

mysql> use business;

実行結果は以下のようになります。

No connection. Trying to reconnect...
Connection id: 10
Current database: *** NONE ***

Database changed
mysql>

「Trying to reconnect...」というメッセージが表示されていることから、クエリの停止によって一度接続が切断されたことが確認できます。また、現在のデータベースが「none」と表示されている点も、接続がリセットされた証拠です。その後、しばらくするとデータベースとの接続は自動的に再確立されます。

補足:標準MySQL環境ではKILLステートメントも使える

なお、mysql.rds_killはAmazon RDSなどで利用可能なストアドプロシージャです。標準のMySQLサーバーでは、代わりにKILLステートメントを使用できます。

KILL 接続ID;        -- 接続自体を切断する場合
KILL QUERY 接続ID;  -- 実行中のクエリだけを停止する場合

KILL QUERYを使えば、接続を維持したまま現在実行中のステートメントのみを中断できるため、状況に応じて使い分けると便利です。

まとめ

MySQLで実行中のクエリを停止する流れは、「SHOW PROCESSLISTでIDを確認」→「rds_killまたはKILLで停止」→「USEコマンドで再接続を確認」の3ステップです。ERROR 2013が表示されても問題ない点を覚えておけば、トラブル時にも落ち着いて対応できるでしょう。

  1. MySQLでNULL値を0に置き換える方法:IFNULL関数の使い方を解説

    MySQLでクエリを実行した際にNULL値が返ってくる場合、IFNULL()関数を使うことで、NULLを別の値(ここでは0)に置き換えることができます。この記事では、実際にテーブルを作成し、NULL値を含むデータに対してIFNULL()を適用する手順を順番に解説します。サンプルテーブルの作成まず、テスト用のテーブルを作成します。Idカラムは自動採番の主キーとし、ValueカラムにはNULLを許容するように定義します。mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMAR

  2. MySQLクエリでOR文が多すぎるのを避けるには?IN()の活用方法を解説

    MySQLでは、複数の条件を指定するときにOR文を何度も繰り返し書くと、クエリが長くなり読みにくくなります。そんなときはIN()を使うことで、クエリをシンプルかつ効率的に記述できます。この記事では、実際にテーブルを作成し、IN()の使い方を実行例とともにわかりやすく解説します。 サンプルテーブルを作成する まず、動作確認用のテーブルを作成しましょう。以下のコマンドで「DemoTable」を作成します。 mysql> create table DemoTable (     Id int NOT NULL AUTO_INCREMENT PRIMAR