【MySQL】実行途中のALTER TABLEとかを安全にキャンセルする

MySQLで次のクエリを発行したとき・・・

  • ALTER TABLE ... ADD INDEX
  • CREATE INDEX ...
  • その他時間のかかるクエリ

もし途中で「あっ!このクエリキャンセルしたい...」「いうまで経っても終わらないよ...」と思っても強制終了してはいけません。(当然ながら)

そこでMySQLにてクエリを強制キャンセルさせる安全な方法をまとめておきます。使わないのが一番だけど非常手段として覚えておくと便利

なぜか ALTER TABLE ADD INDEX が終わらない

僕はテスト環境としてXAMPPを使ってます、

そこで次のクエリを発行しました。

▼ あるカラムにインデックス追加

実際はこんなテーブルじゃないけど例として。

そのテーブルには既に20万件近くあって、それでインデックス追加したけど一向に終わりません。さすがに1時間超えたあたりから不安になりました。

とはいえインデックス追加って1時間は序の口らしく、場合によっては9時間・10時間以上かかるのも珍しくないみたいです。

でもさすがに時間がかかりすぎる...

※ ちなみに思いつきのインデックス追加

だから途中でキャンセルすることにしました。

MySQLでクエリをキャンセルする手順

やり方はそんなに難しくありません。

次の手順を踏んでいけばいいだけです。

1.止めたいクエリのプロセスIDを調べる

まずはクエリのプロセスIDから調べます。

▼ 次のクエリで一覧取得可能

▼ こういう結果が帰ってきた

この結果のidカラムがプロセスIDです。

その中に自分が発行したクエリもあったけど、何らかの原因で実行が保留中になってました。恐らくインデックス追加中に別クエリ発行したのが原因だと考えられます。

2.プロセスIDを指定してキャンセル

あとはキルするクエリを発行するだけ

もしphpMyAdminを使っているなら、 show prosesslist して出てくる結果の中に「停止」を押してもキャンセルすることも可能です。

実行中クエリを止める時はプロセスIDでキルする

実行中クエリはキルしない限り動き続けます。

そのときキルできることが分からなず、悩んだ挙句に「MySQL自体をいったん止めるか…」なんて最悪の決断をしないように気を付けましょう。(実験環境だとしてもいい判断ではない)

以上、MySQLでのクエリ途中キャンセルの方法でした。ではまた

Shareこの記事をシェアしよう!

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください