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

MySQLで実行中のクエリを停止する方法|KILLコマンドとmysql.rds_killの使い方

MySQLで実行中のクエリを停止する基本

MySQLでは、重い処理や暴走したクエリが原因でサーバーのパフォーマンスが低下することがあります。そのような場合、実行中のクエリを強制的に停止する必要があります。MySQLには主に2つの停止方法があります。

  • KILLコマンド:プロセスID(processId)を指定して接続やクエリを終了させる標準的な方法
  • mysql.rds_killストアドプロシージャ:Amazon RDSなどの環境で利用できる代替手段

KILLコマンドの構文

実行中のMySQLクエリを停止するには、KILLコマンドにプロセスIDを指定します。基本的な構文は以下のとおりです。

kill プロセスID;

また、RDS環境などでは次の構文でも実行中のクエリを停止できます。

CALL mysql.rds_kill(クエリID);

STEP1:SHOW PROCESSLISTでプロセスIDを確認する

まず、現在動作しているプロセスの一覧とそのIDを取得しましょう。以下のコマンドを実行します。

mysql> SHOW PROCESSLIST;

実行結果は次のように表示されます。

+----+-----------------+-----------------+----------+---------+--------+------------------------+------------------+
| Id | User            | Host            | db       | Command | Time   | State                  | Info             |
+----+-----------------+-----------------+----------+---------+--------+------------------------+------------------+
| 4  | event_scheduler | localhost       | NULL     | Daemon  | 221718 | Waiting on empty queue | NULL             |
| 47 | root            | localhost:60722 | business | Query   | 0      | starting               | show processlist |
+----+-----------------+-----------------+----------+---------+--------+------------------------+------------------+
2 rows in set (0.03 sec)

この例では、2つのプロセスが稼働しています。各カラムの意味は以下のとおりです。

  • Id:プロセスを識別する一意の番号。KILLコマンドで使用します
  • User / Host:接続元のユーザーとホスト情報
  • db:使用中のデータベース名(NULLの場合は未選択)
  • Command / Time / State:実行中のコマンド種別、経過時間、状態
  • Info:実行中のSQL文の内容

特定のプロセスを停止したい場合は、この「Id」の値を使ってKILLコマンドを実行します。

STEP2:KILLコマンドでクエリを停止する

例として、IDが47のプロセスを停止してみます。実行すると、対象のクエリは中断されます。

mysql> KILL 47;
ERROR 1317 (70100): Query execution was interrupted

表示されている「ERROR 1317 (70100): Query execution was interrupted」というメッセージはエラーではなく、「クエリの実行が中断された」ことを示す正常な反応です。これにより、対象のクエリが強制終了されたことがわかります。

STEP3:mysql.rds_killを使う方法(AWS RDSなど)

Amazon RDSなど一部の環境では、SUPER権限による直接のKILLが制限されている場合があります。そのような場合は、mysql.rds_killストアドプロシージャを使用します。

mysql> CALL mysql.rds_kill(47);
ERROR 2013 (HY000): Lost connection to MySQL server during query

こちらも同様に、表示されるメッセージは対象の接続・クエリが終了したことを意味しており、問題なく停止できています。

補足:KILL CONNECTIONとKILL QUERYの違い

KILLコマンドには2つのバリエーションがあり、用途に応じて使い分けると便利です。

  • KILL connection_id:指定した接続自体を切断し、その接続上の処理をすべて終了させます
  • KILL QUERY connection_id:接続は維持したまま、現在実行中のステートメントだけを中断します

長時間実行されているクエリだけを止めたい場合は「KILL QUERY」を、不正な接続ごと切断したい場合は通常の「KILL」を使用するのがおすすめです。

まとめ

MySQLで実行中のクエリを停止する手順は以下のとおりです。

  1. SHOW PROCESSLIST;で対象プロセスのIDを確認する
  2. KILL ID;またはCALL mysql.rds_kill(ID);を実行して停止する

表示されるエラーメッセージはクエリが中断されたことの通知なので、心配ありません。重いクエリがサーバーに負荷をかけている場合は、これらのコマンドを活用して素早く対処しましょう。

  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