誤って、巨大なテーブルの全レコードを対象にするようなクエリを投げてしまって、いつまで経っても計算結果が返ってこないことってあるじゃないですか。そんなときの話。
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 ビギナーの自分はこの挙動に驚きました、という話です。メモメモ。
- 関連記事
- MySQLでBLOB/TEXT型カラムにインデックスを張る
- mysql のスレーブを再構築する
- MySQLのレプリ遅延の原因を調べる方法
- PostgreSQLでMONTHS_BETWEEN
- PostgreSQLで半角カナを全角カナに変換する関数