MySQLで次のクエリを発行したとき・・・
- ALTER TABLE ... ADD INDEX
- CREATE INDEX ...
- その他時間のかかるクエリ
もし途中で「あっ!このクエリキャンセルしたい...」「いうまで経っても終わらないよ...」と思っても強制終了してはいけません。(当然ながら)
そこでMySQLにてクエリを強制キャンセルさせる安全な方法をまとめておきます。使わないのが一番だけど非常手段として覚えておくと便利
このページの目次
なぜか ALTER TABLE ADD INDEX が終わらない
僕はテスト環境としてXAMPPを使ってます、
そこで次のクエリを発行しました。
▼ あるカラムにインデックス追加
1 2 3 4 |
ALTER TABLE user_profiles ADD INDEX index_user_idx(user_id) |
実際はこんなテーブルじゃないけど例として。
そのテーブルには既に20万件近くあって、それでインデックス追加したけど一向に終わりません。さすがに1時間超えたあたりから不安になりました。
とはいえインデックス追加って1時間は序の口らしく、場合によっては9時間・10時間以上かかるのも珍しくないみたいです。
でもさすがに時間がかかりすぎる...
※ ちなみに思いつきのインデックス追加
だから途中でキャンセルすることにしました。
MySQLでクエリをキャンセルする手順
やり方はそんなに難しくありません。
次の手順を踏んでいけばいいだけです。
1.止めたいクエリのプロセスIDを調べる
まずはクエリのプロセスIDから調べます。
▼ 次のクエリで一覧取得可能
1 |
show processlist; |
▼ こういう結果が帰ってきた
この結果のidカラムがプロセスIDです。
その中に自分が発行したクエリもあったけど、何らかの原因で実行が保留中になってました。恐らくインデックス追加中に別クエリ発行したのが原因だと考えられます。
2.プロセスIDを指定してキャンセル
あとはキルするクエリを発行するだけ
1 |
kill 1428; |
もしphpMyAdminを使っているなら、 show prosesslist して出てくる結果の中に「停止」を押してもキャンセルすることも可能です。
実行中クエリを止める時はプロセスIDでキルする
実行中クエリはキルしない限り動き続けます。
そのときキルできることが分からなず、悩んだ挙句に「MySQL自体をいったん止めるか…」なんて最悪の決断をしないように気を付けましょう。(実験環境だとしてもいい判断ではない)
以上、MySQLでのクエリ途中キャンセルの方法でした。ではまた