サーバの引っ越しに合わせて、まず念頭にあったのはMovableTypeのバージョンアップでした。MovableType5が出るということで、本来ならばそれに合わせたバージョンアップにすべきなんでしょうが、なにぶん新バージョンは未知数。上手く軽快に動いてくれれば良いですが、それは今はまだわかりませんし、うちの膨大なエントリをインポートしてきちんと動くかもまた別問題。そういうわけで、きちんとしたMySQLと組み合わせると実はSQLiteより軽快に動くMovableType4を採用することにしました。
それに当たって新サーバではMySQLのバージョンを4ではなく5.1に変更しました。さくらインターネットでは暫く前から5.1が選択可能になってはいたのですが、一度DBのリセットが必要なため二の足を踏んでいたのですね。今回、引っ越しと言うことで有無を言わさずリセットになるので良い機会だと。
以上をふまえて、今回の移行の概要は以下の通りになります。
移行前
- MovableType 3.36
- SQLite
- 移行対象データ数: 6,734(公開6,686 / 下書き48)
移行先
- MovableType 4.261
- MySQL 5.1
以下、この移行に伴ういくつかの問題点とその解決策です。
最初の手順 ... 旧ブログからのデータエクスポート
もし旧ブログがMySQLであれば、dumpデータの移行だけで済んでいたかも知れませんが、なにぶんSQLiteだったため、データのエクスポートが必要でした。いや、本当は変換も出来るのかも知れませんが、テキスト内容に一括で変換を加えたい部分もあった(画像ディレクトリなど)ので、エクスポートが都合が良かったのですね。
エクスポートしたデータは24.7MB。案外大したことありません。テキストデータならこんなもんでしょう。これを一気にインポートしようと試みましたが、当然出来るわけもなく、20,000行程度で区切りながらファイルを16分割して何とかインポート完了。
問題点その1: タグがエクスポートされていない!
タグクラウドの書き出しをしようとしたところで初めて気づきましたが、MovableTypeのエクスポートはタグ情報を書き出してくれないんですね...これはダメだと思ってインデックステンプレートを使って書き出す方法を考えましたが、それだと公開されていないエントリは書き出されないので移行データとしては役に立ちません。
MovableTypeのインポート/エクスポート用ライブラリである、「lib/MT/ImportExport.pm」を見てみると、タグが書き出されるべき部分(516行目あたり)がこうなっています。
DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$>
-----
BODY:
ここにタグに関する記述を追加してやればOK。
DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$>
<MTEntryIfTagged>TAGS: <MTEntryTags glue=",">"<$MTTagName quote="1"$>"</MTEntryTags></MTEntryIfTagged>
-----
BODY:
これでタグ情報も含めたデータが書き出されます。
問題点その2: タグが重複して読み込まれる
というわけでタグも無事書き出されたので、例によって分割/変換を行って(この部分はでっち上げたスクリプトでの処理です。1MBを越えたエントリまでで区切って24ファイルに分割)、1時間ほどかかってインポートしてやると...タグが重複して読み込まれてる!
どうやら日本語のタグが上手く判別できていないようです...
検索してみるとこんな情報が。
AM3 | aquamind 3: MovableTypeにて同じ名前の日本語タグが重複して表示されるのを直す方法
どうやらMySQLの問題らしいです。確かに、DBの照合順序は「utf8_general_ci」なのに、テーブルおよび各フィールドの方は「ujis_japanese_ci」になってますね...
というわけで、これを変更して再度インポートし直したら...出来た!
他の環境、他のバージョンでは問題ないかも知れませんが、一応確認しておくと良いかもです。
結局、2日ほどかかりました。
実際にはここで書いたよりもう少し試行錯誤してる(2エントリだけのファイル作ってインポートしてみたりとか)ので、完全にインポートできるまでは2日かかりました。問題がわかるごとにインポートし直しとか面倒すぎ...
とにもかくにも、何とか上手く行って良かったです。やれやれだぜ...
ちなみにMovableType4+MySQLの使用感は?
超快適です。
今まで俺は何をやっていたのかと。
MovableType4+SQLiteではあんなに遅かったのに...
これまで下書きを保存するのでも2-3分掛かっていたのが5秒くらいに短縮されました。また、全体を再構築する時間もこれまで1時間以上掛かっていたんですが、35分に短縮。「それでも遅い」と思われるかも知れませんが、大量のエントリを抱えてる以上、仕方ないんですよね...