MySQLで実行中のSQLをキャンセルする

/ db

誤って、巨大なテーブルの全レコードを対象にするようなクエリを投げてしまって、いつまで経っても計算結果が返ってこないことってあるじゃないですか。そんなときの話。

mysql> show processlist;
+----+------+---------------+------+---------+------+-------+------------------+
| Id | User | Host          | db   | Command | Time | State | Info             |
+----+------+---------------+------+---------+------+-------+------------------+
|  9 | root | localhost     | NULL | Query   |    0 | NULL  | show processlist |
| 10 | root | localhost     | NULL | Sleep   |    1 |       | NULL             |
+----+------+---------------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)

processlist では、現在実行中のスレッドを一覧表示することができる。1列目の Id はスレッドID。時間のかかっているSQLがあれば、Info にそのクエリが表示されるはずなので、その Id を調べて Kill すれば、スレッドを強制終了することができる。

mysql> kill 10;

ターミナルコンソールから Ctrl+C でキャンセルしたつもりになっていたのに、ロードアベレージがぐんぐん伸びていって焦って、ようやくこの方法を知ることになったのは、ここだけの秘密。

ほら、PostgreSQL だと Ctrl+C でクエリはキャンセルできるし、接続はプロセスで見れるから、mysql ビギナーの自分はこの挙動に驚きました、という話です。メモメモ。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/507