MT-ShrinkFInfo

肥大化したfileinfo.dbをshrinkするための簡単なツール。Movable Type 3.1専用。3.14以降のバージョンでは不要です。

ShrinkFInfo.zip

更新履歴

  • 0.01(2004.11.28):
    • 公開開始。
  • 0.02(2004.11.28):
    • できるだけ不要なshrinkが行われないように修正。コードのクリーンアップ。
  • 0.03(2004.11.29):
    • プラグインインタフェースの追加。(実験)クッキーを使ったアクセス制限機能の追加。
  • 0.04(2004.12.10):
    • プラグインインタフェースの改善。DBファイルサイズを表示する他、プラグインアクションを利用。
  • 0.04a(2004.12.12):
    • 0.04のツマラナイバグの修正。Storableのない場合に少し配慮。

概要

Movable Type 3.1でBerkeleyDBを使っている場合、再構築を繰り返すたびにfileinfo.dbが肥大化するという問題が知られていますhttp://park5.wakwak.com/~tito/archives/2004/09/movable_typeafi.html。具体的には、MTは再構築のたびに古いFileInfoオブジェクトを削除して、新しいFileInfoオブジェクトを生成しますが、このときBerkeleyDBを使っている場合に限って、(1) 古いFileInfoオブジェクトの消去をし損なう場合があること、(2) 削除してもfileinfo.dbファイルの空き領域が開放されないこと、がこの肥大化の原因となっています。

mt-shrinkfinfo.cgiは、肥大化したfileinfo.dbをshrinkするための簡単なツールです。Movable TypeのPerl APIを使って実現されているため、直接DBイメージファイルを削除したりする方法に比べて安全であり、また容易です。

使い方

  • mt.cfgのDataSourceがフルパスで指定されていることをまず確認してください(c.f., mtinstall - Movable Typeのインストール)。
  • 次にShrinkFInfo.zipをダウンロードして展開します。
  • 展開してできたShrinkFInfoというディレクトリごとpluginsディレクトリにコピーし、mt-shrinkfinfo.cgiの実行権限を設定しておきます。↓のディレクトリ構成を参考にしてください。
mt ┬ extlib
   ├ images
   ├ lib
   ├ php
   └ plugins ─ ShrinkFInfo ┬ plugin.pl (644)
                             └ mt-shrinkfinfo.cgi (755)
  • サーバーの設定によっては、mt-shrinkinfo.cgiを700した方がよいかもしれません。このあたりはサーバーのドキュメントに従ってください。また、ShrinkFInfoというディレクトリ名は何であっても構わないので別の名前に変更しておくことをお勧めします。
  • 管理画面にアクセスすると下のように表示されるはずです。「ShrinkFInfo Plugin」のところをクリックすればshrinkしてくれます。

以降は管理画面からいつでもshrinkすることができます。

また、experimentalな機能としてクッキーに格納されたMovable Typeのログイン情報を使ってアクセス制限を加えることができます。mt-shrinkfinfo.cgiの12行目を以下のように修正するとこの機能が有効になり、「ブログの追加」権限のあるユーザのログイン情報がクッキーに格納されている場合に限って、shrinkが実行されるようになります。

use constant USE_COOKIE_CHECK => 1;

0.04から追加された機能

小粋空間のyujiroさんのアイディアを拝借して、管理画面のプラグインの説明に現在のfileinfo.dbのファイルサイズを表示するようにしました。

また、ファイルサイズが1MBを越える場合には、shrinkを促すべく、管理画面だけでなくブログのウェルカム画面にもプラグインの表示が出るようにしました。下のようにウェルカムメッセージの下に表示されます。それにしても「ブラグイン」て…。

ブログのウェルカム画面でのプラグイン表示・非表示のThresholdになる値(デフォルトでは1MB)はplugin.pl中の定数FINFO_THRES_MBで変更できます(単位はMB)。エントリー数が多目の人は少し大きい値にした方がよいかもしれません。

use constant FINFO_THRES_MB => 1;

2004-12-12追加:

StorableがインストールされていないとPluginが機能しない件ですが、この問題で困っている人はもう一度ダウンロードし直してインストールすることをお勧めします。実は管理画面の表示はStorableがないとできません。一方で0.04で加えたウェルカム画面での表示はできます。つまり、

  • Storableがある人 → 管理画面とウェルカム画面
  • Storableがない人 → ウェルカム画面だけ

という形で利用できるはずです。

よくある質問とその答え

管理画面を使うのが煩わしいのですが?
pluginsフォルダにコピーするのを止めてmt-shrinkfinfo.cgiをmt.cgiなどと同じディレクトリに置いても動作します。この場合、mt-shrinkfinfo.cgiという名前を必ず変更しておくことをお勧めします。でないと簡単に他の人に実行されてしまいます。また、この場合はplugin.plをコピーする必要はありません。
クッキーを使ったアクセス制限は何をやっているのですか?
Movable Typeへのログイン時に「情報を登録する?」にチェックを入れておくと、ログイン時のユーザー名とencryptされたパスワードをクッキーに保存します。mt-shrinkinfo.cgiはこのクッキーを読み出し、MT側で保存しているユーザーDBと照合します。
それって危なくないですか?
クッキーでセッション管理をするWebアプリケーションには共通の問題があります。それはクッキーの認証情報だけを元にクリティカルな操作のアクセス制御を行っている場合、そうした操作を行うURLが既知ならばそれを踏ませるexploitが容易に可能だということです。幸いにしてfileinfo.dbの操作はそれほどクリティカルではありません。また、URLの秘匿に関してもプラグイン化が寄与するでしょう。どういう意味かと言うとプラグインのディレクトリ名は記憶不可能な程にランダムなものに変更しても管理画面には表示されます(試してみると面白いです)。つまり、プラグイン化によってURLの秘匿性と操作の容易性を両立させることができたということです(というほど大げさなことではありませんが)。
FileInfo?のバグ取りはしないんですか?
少しやってみたのですが、モティベーションがなかなか盛り上がりません。私自身MySQLユーザです。
そもそもFileInfo?って何よ?
よい質問です。実はモティベーションが盛り上がらないのは私がBerkeleyDBを使っていない事実以外にそれが関係しています。ダイナミック・パブリッシング時にmtview.phpは要求されたURLにあった内容を生成するわけですが、このマッピング情報を提供するのがFileInfoです。つまり、ここが重要ですが、BerkeleyDBを使っている場合ダイナミック・パブリッシングは使えませんからFileInfoを生成・削除すること自体無駄なことなのです。上で「クリティカルでない操作」と言っているのはそういう意味です。
Six Apartでは対応しないの?
私はSix Apartではないので分かりませんが、3.14159というベータバージョンでは不必要な場合にはFileInfoを作らないように修正されているようですよ。

注意点

*BerkeleyDB以外のDBを使っている場合、mt-shrinkfinfo.cgiを実行しても意味はありません。なぜなら「(1) 古いFileInfoオブジェクトの消去し損なう場合があること」という現象そのものが起きないためです。念のため、このCGIスクリプト自体はMySQLやPostgreSQL、SQLiteを使っている場合に実行しても無害なようにしてあります。

  • MT3.0以前のバージョンでは実行しても意味がないか、実行不可能です。
  • ノークレーム・ノーリターンでおながいします。

See Also

Attachments