LoginSignup
34
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-01-09

概要

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
34
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
26