MySQL 上のログテーブルの扱い方

保存期限を3か月とか、任意の期間で自動削除する仕組みについて。
ログっていうのは、アクセスログとかアクティビティーログを想定している。
単純にログテーブルを作成してデータを入れていくのは簡単だけど、古いデータをどのタイミングで、どのように消すか、というのが問題。

ただこれ調べ始めていきなり結論っぽいものを発見してしまった。

Mobageを支える技術 ~ソーシャルゲームの舞台裏~ (WEB+DB PRESS plus)

Mobageを支える技術 ~ソーシャルゲームの舞台裏~ (WEB+DB PRESS plus)

P216 あたりから、Range パーティションしたテーブルとイベントスケジューラを組み合わせてローテートを行う方法。普通これを使うんだろうな・・・。

MySQLパーティションテーブルについてはこちらがわかりやすい。
高速処理化!MySQLのパーティショニング機能を使ってみよう | 東京上野のWeb制作会社LIG

↓とても詳しい。さすが DeNA のなかのひと。
ソーシャルゲームのためのMySQL入門 - Technology of DeNA

日次等のタイミングでイベントスケジューラを利用して

を行うだけ。

ただし、以下のような事で、IF [NOT] EXISTS は使えないので、ちょっと工夫は必要。

ADD PARTITION と DROP PARTITION は現在 IF [NOT] EXISTS をサポートしていません。パーティションや分割されたテーブルをリネームする事も不可能です。その代わりに、もしパーティションをリネームしたいのであれば、パーティションをドロップして再作成する必要があります。そしてもし分割済テーブルをリネームしたければ、全てのパーティションをドロップし、テーブルをリネームし、そしてドロップされたパーティションをもう一度追加する必要があります。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.7 ALTER TABLE 構文


イベント処理については以下。
http://idocsq.net/page/160
http://dev.mysql.com/doc/refman/5.1-olh/ja/create-event.html

レプリケーション考えると面倒が起きそうなので、ウチではイベントスケジューラ使わずに、素直に cron に perl スクリプト仕込む感じでやることにしそう。