MySQL

負荷の高いMySQLでメタデータを極力ロックさせずにDROP TABLEする

More than 1 year has passed since last update.


概要

MySQLではDROP TABLEするときにメタデータをロック(MySQL5.5以前の場合)します。

数千万件を超えるようなテーブルをDROP TABLEすると平気で数十秒かかったりするため、その間は高負荷状態になったり、メタデータがロックされているために解除までDDLを流せなかったり、などなど不都合がありします。

大量のレコードを持つテーブルのDROP TABLEに時間を要するのは同期的にデータファイルを削除しようとするためです。

DROP TABLEすると内部的にデータファイルをunlinkしますが、リンク数が0になると(実際はそれだけじゃないけれど)ファイルシステム上の実データ削除処理が走り、巨大なファイルであればあるほどその処理に時間を要することになります。

そこでunlinkされてもリンク数が1以上あれば実データの削除処理は走らないのでは?ということになります。

すなわち、あらかじめデータファイルにハードリンクを張っておいてからDROP TABLEすれば、大量レコードのテーブルをDROP TABLEしてもすぐに終わります。


手順


データファイルにハードリンクを張る

$ ln /var/mysql/data/messages.ibd /home/foo/messages.ibd


DROP TABLE

mysql> DROP TABLE messages;


データファイルをioniceで優先度下げつつ穏やかに削除

$ ionice -c 3 rm -f /home/foo/messages.ibd