Yoshi.dev

技術系の趣味、またはやった仕事やそこから学んだことを忘れないために

InnoDBではレコード削除しても容量確保されない

MySQL使っていて大量のデータを削除してもサーバーの容量が解放されなくて焦った。
 
InnoDBではレコード削除してもその容量を開放してくれなくて、別途

alter table t engine=InnoDB;

と叩く必要があるらしい。


試しにAlter流してみるとテーブルが巨大だったためかなり時間がかかりました。
しかも、流してる間謎にサーバーの容量が減っていく。
公式ドキュメントに
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.7 ALTER TABLE 構文

ほとんどの場合、ALTER TABLE は元のテーブルの一時的なコピーを作成します。

とあったので、多分そのせいだと思う。
自分の場合サーバーの容量が結構ギリギリだった(98%とかいってた)ので、ヤバイパンクする
という状況でした。
 
結局はテーブルのデータ全削除が許される状況だったので、
Drop TableしてからすぐCreate Tableすることで無事解決しました。
(後からわかったけどTruncateでも良かったっぽい。動いてるシステムだったからむしろTruncateした方が安全だった。)

いやー、焦った...

追記:この仕様は後で再利用するためにやっていることっぽい
なのでデータの削除と登録を繰り返す分には問題なさそう(未検証だけど)