- 2009-07-09 (木) 09:06
- MovableType


- EntryIDを引き継いで乗り換える
Movable Type 5、発表かぁ。おおまかな動きは、すでにシックスアパートの方々から漏れ聞こえていたけど、10月ってのは思ったより早かったですね。もっとかかるのかと思っていた。
まぁ、楽しみですね。
うかうかしていると、意味のないエントリーになりそうなので、ネタはため込まずに行きます。
どうやら、データリストア完了したので、(あとはアクションストリームのテンプレートとスタディブログのリストアのみ)作業中試行錯誤した「EntryIDを引き継いでインポートさせる方法(with phpMyAdmin)」について書きます。
かなり力技なので、あまりお勧め出来ないですが、参考として読み飛ばしてください。
基本部分はあくまで、MovableTypeのエクスポート・インポートの機能を利用します。
ただしエクスポート部分は、実際にはMTテンプレートからの出力を利用するので、MT3.xなどの異なるバージョンでも実行可能です。
このMTテンプレートによるエクスポートは、MTEntriesで出力エントリー数を制限できるなど、読み込みのタイムアウトが発生するケースなどでも有効です。
ただし、本来EntryIDはインポート対象ではありませんので、引き継がせるために、どれか一項目を犠牲にしなくてはなりません。
私は最近使っていない「キーワード」部分を代わりに使用しました。
以下は参考サイト。
- 「Movable Type のブログ記事インポートフォーマット | Movable Type 4 ドキュメント」
- 「MT3→MT4へタグやbasenameを引き継いで(インポート&エクスポートで)簡単に移行する方法。 (Junnama Online (Mirror))」
行頭に連続したハイフンを使った事がある方は、Junnamaさんのプラグインを使ってください。
<MTEntries lastn="65535"> AUTHOR: <$MTEntryAuthor strip_linefeeds="1"$> TITLE: <$MTEntryTitle strip_linefeeds="1"$> BASENAME: <$MTEntryBasename$> STATUS: <$MTEntryStatus strip_linefeeds="1"$> ALLOW COMMENTS: <$MTEntryFlag flag="allow_comments"$> CONVERT BREAKS: <$MTEntryFlag flag="convert_breaks"$> ALLOW PINGS: <$MTEntryFlag flag="allow_pings"$> <MTIfNonEmpty tag="MTEntryCategory"> PRIMARY CATEGORY: <$MTEntryCategory$></MTIfNonEmpty> <MTEntryCategories> CATEGORY: <$MTCategoryLabel$> </MTEntryCategories> DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$> <MTEntryIfTagged> TAGS: <MTEntryTags include_private="1" glue=","><$MTTagName quote="1"$></MTEntryTags></MTEntryIfTagged> ---- BODY: <$MTEntryBody convert_breaks="0"$> ---- EXTENDED BODY: <$MTEntryMore convert_breaks="0"$> ---- EXCERPT: <$MTEntryExcerpt no_generate="1" convert_breaks="0"$> ---- KEYWORDS: <$MTEntryID$> ---- <MTComments> COMMENT: AUTHOR: <$MTCommentAuthor strip_linefeeds="1"$> EMAIL: <$MTCommentEmail strip_linefeeds="1"$> IP: <$MTCommentIP strip_linefeeds="1"$> URL: <$MTCommentURL strip_linefeeds="1"$> DATE: <$MTCommentDate format="%m/%d/%Y %I:%M:%S %p"$> <$MTCommentBody convert_breaks="0"$> ----- </MTComments> <MTPings> PING: TITLE: <$MTPingTitle strip_linefeeds="1"$> URL: <$MTPingURL strip_linefeeds="1"$> IP: <$MTPingIP strip_linefeeds="1"$> BLOG NAME: <$MTPingBlogName strip_linefeeds="1"$> DATE: <$MTPingDate format="%m/%d/%Y %I:%M:%S %p"$> <$MTPingExcerpt$> ----- </MTPings> -------- </MTEntries>
これをインデックステンプレートにすれば、エクスポートと同等のデータが作成できます。(もちろん再構築してね)
インポート時にタイムアウトが発生するなどで、分割出力したい場合には、offsetやlimitを使って出力範囲を指定するか、月別アーカイブにしてもいいと思います。
さて、新しいDBを作成しMovableTypeをインストールします。
大抵は ブログID1 に、1コメントが付いた状態の1エントリーが出来ているはずです。
エントリーIDうんぬんが無ければ、先程再構築したテキストを、インポートすれば終了です。分割出力した場合は、複数回インポートを繰り返します。
さてうまくインポートできると、エントリーは2から連番で、EntryIDが振られていると思います。
ここからはphpMyAdminなどを使ってSQLで作業します。(これ以降の作業はMySQLデータベースに対してphpMyAdminを使って作業しています。データベースの種類によってはSQL文の修正が必要かもしれませんので、確認してください。)
まずは「mt_entry」の「entry_id」を参照しているテーブルを書き換えるための、SQL文を作成するテンプレートを作り、再構築してテキストにします。
一番最初は、エントリーのatomID部分です。これは場合によっては、必要無いでしょう。
<MTEntries lastn="65535"><$MTEntryID setvar="dummy_id"$><MTSetVar name="dummy_id" value="2000" op="+">UPDATE `mt_entry` SET `entry_atom_id` = 'tag:<$MTBlogHost$>,<$MTEntryDate format="%Y"$>:/<$MTBlogName dirify="1"$>//<$MTBlogID$>.<$MTEntryKeywords$>' WHERE `entry_id` = <$MTEntryKeywords$>;UPDATE `mt_comment` SET `comment_entry_id` = <$MTEntryKeywords$> WHERE `comment_entry_id` = <$MTVar name="dummy_id"$>;UPDATE `mt_trackback` SET `trackback_entry_id` = <$MTEntryKeywords$> WHERE `trackback_entry_id` = <$MTVar name="dummy_id"$>;UPDATE `mt_objecttag` SET `objecttag_object_id` = <$MTEntryKeywords$> WHERE `objecttag_object_id` = <$MTVar name="dummy_id"$>;UPDATE `mt_placement` SET `placement_entry_id` = <$MTEntryKeywords$> WHERE `placement_entry_id` = <$MTVar name="dummy_id"$>;</MTEntries>
SQL文はかなりの分量になります。工夫して分割した方が良いと思います。
なんで2000足してやってるのかというと、私のケースでのエントリーIDが1500番台で、更新中に番号が重複したり再度変更されたりが起きないように、ずらしたかったからです。ここら辺はじっくり事前に考える事が必要です。
今使ったSQL文は最後に使うとして、entry_idの書き換えなどを、直接SQLで行います。
私はphpMyAdminのSQLタブ使って実行しました。
UPDATE `mt_entry` SET `entry_id` = `entry_id` + 2000;UPDATE `mt_entry` SET `entry_id` = `entry_keywords`;UPDATE `mt_entry` SET `entry_keywords` = NULL;UPDATE `mt_comment` SET `comment_entry_id` = `comment_entry_id` + 2000;UPDATE `mt_trackback` SET `trackback_entry_id` = `trackback_entry_id` + 2000;UPDATE `mt_objecttag` SET `objecttag_object_id` = `objecttag_object_id` + 2000;UPDATE `mt_placement` SET `placement_entry_id` = `placement_entry_id` + 2000;
これで、entry_idは本来の値になりますが、コメントやトラックバック・タグ・カテゴリーとの関連付けが切れています。
先程再構築したSQL文を実行することで、関連付けが正常になります。
テキストのSQL文の実行はphpMyAdminのインポートを使うと簡単です。
あっいけね。「mt_entry」テーブルのAUTO_INCREMENTの値が小さいままなので、ALTER TABLEでセットし直す必要があるの、書き忘れていました。
今回のやり方は、一つ順番を間違えただけで、取り返しがつかなくなります。とにかく慎重にバックアップを取りながら実行する必要がありました。
特別な理由が無い限り、この方法はおすすめしません。
何度失敗した事か・・・![]()
- Newer >: MT4.3が出るの?
- < Older: Eye-FiでMovableTypeにアイテム登録
ping a Trackback
- TrackBack URL for this entry.(1)
Comments:(2)
-
said
July 9, 2009 4:44 AM
|
ReplyThis!
おはようございます。
よく分からないのですが,エクスポートができるところまでDBが復活できているなら,mysqldump を使った移行
http://blog.as-is.net/2006/07/mysql.html
で EntryID その他を全て保存したままでいけると思うのですが,これではダメですか?-
-
replied for
n's comment
July 9, 2009 8:54 AM
|
ReplyThis!
おはようございます。nさん。
全然問題ないですよ。
裏事情を話すとですね、DB飛ぶ前に試行錯誤していた、エクスポートテキストだけが残っていたのが理由です。DBは完全に死んでました(というか、間違って殺した)
。
通常はこういうケースは無いと思います・・・
後は私が色々な事試すせいで、おかしな痕跡の残っているテーブルを、シンプルな状態に戻したかったのもあります。
-




スクリプトの読み込みが完了していません。
メールフォーム(Javascriptを使用していません)や、
Twitter経由のCommentでもReplyいたします。ただし返信はブログのコメントとして行う事もあります。