いっしきまさひこBLOG

Web制作関連、プログラミング関連、旅行記録などなど。

サーバー移行でMTにログインできなくなったときの対処方法

Movable Type(以降、MT)で、Webサーバーを移行する場合、標準データベースのBerkeley DB(以降、DB)なら、別サーバーにそのままコピーして使うことが可能です(その際、前のサーバーのディレクトリ構成と同じにした方が、移行の手間が軽減できる)。しかし、DBごとMTを移行して、MTにログインできなくなった場合、前のサーバーと今のサーバーでインストールされているBerkeley DBのバージョンが異なる可能性があります。

DBのバージョンが違う場合は(DBバージョンが不明な場合は試してみる価値あり)、次のサイトに載っている手順でDBのファイルをアップグレートすると、MTにログインできるようになります。

Movable Type User Manual: TROUBLESHOOTING "I changed hosts, and now I can't log in to Movable Type."

具体的には次のような手順になります(事前にTelnetやSSHでログインする)。

1. DBファイルを置いている場所に移動してください(なおDBファイルは必ず別の場所にコピーするなどして、バックアップを取ってください)。

$ cd <DBファイルを置いているディレクトリ>

2. 次の「DBをアップグレードする」ためのコマンドを実行してください。

$ db_upgrade *.db *.idx

このコマンドが正常に実行できれば、データベースのアップグレードは終了です。

しかし、次のように「ファイルの種類が認識できない」という内容のメッセージが表示されて、正常にコマンドが実行できなければ、以下の手順も実行する必要があります。

db_upgrade: author.db: unrecognized file type

db_upgrade: DB->upgrade: author.db: Invalid argument

3. 「DBのアップグレード」ができない場合、「DBのダンプを取って、それを読み込みなおす」必要があります(ちなみに「ダンプ(Dump)」とは、データベースの情報をファイルに書き出して保存することで、バックアップのようなものです。つまりここでは、データベースのバックアップをとって、それをロードする作業を行います)。

DBのダンプを取るコマンドには次の2つがあります。

・db_dump(DBのバージョン2以上用のコマンド)

・db_dump185(古いDBのバージョン1.85、1.86用のコマンド)

この2つのどちらのコマンドを使うかは、DBのバージョンによって異なります。どちらのコマンドを使うべきかは、次のコマンドを実行することで確認できます。

$ db_dump author.db

これで、次のような英数字の並びが出力されれば、「db_dump」が使用できます。

format=bytevalue

type=btree

db_lorder=1234

db_pagesize=8192

HEADER=END

31

53455247000000046e616d65…(中略)…0131

33

53455247000000046e616d65…(中略)…0133

もし、次のように「ファイルの種類やフォーマットが未知のものだ」という内容のメッセージが表示されて、コマンドが失敗する場合、db_dumpは使えません。db_dump185を使うことになります。

db_dump: author.db: unexpected file type or format

db_dump: open: author.db: Invalid argument

db_dump185が本当に使えるかどうかもチェックしておいたほうがよいです。これには次のコマンドを実行してみてください。

$ db_dump185 author.db

これで英数字の並びが出力されれば成功です。もし、先ほどと同じように「ファイル・フォーマットが未知」というメッセージが表示されるなら失敗です。失敗の場合、現状ではダンプができずDBをアップグレードできません(サーバー管理者に問い合わせてみてください)。

4. db_dumpもしくはdb_dump185のどちらが使えるか判明したら、次の4つのコマンドを順番に実行してください。

・db_dump -f <ダンプ・ファイル> <DBファイル>

 →DBファイル(例:author.db)の内容を、ダンプ・ファイル(例:author.db.data)に出力(=ダンプ)する。

・mv <DBファイル> <名前変更後のDBファイル>

 →ダンプが完了したDBファイル(例:author.db)は、名前を変更して(例:author.db.old)バックアップしておく(rmコマンドなどで削除してもよい)。

・db_load -f <ダンプ・ファイル> <DBファイル>

 →ダンプ・ファイル(例:author.db.data)からデータを読み込んで(=ロード)、DBファイル(例:author.db)を復元する。

・chmod 666 <DBファイル>

 →最後にMovable Typeからアクセスできるように、DBファイル(例:author.db)のアクセス権限を設定する(この設定は環境に合わせて行ってください)。

この4つのコマンドをすべてのデータベース関連ファイル(*.dbファイルと*.idxファイル)に行う必要があります。具体的には、次に示すコマンドを1つ1つ実行していかなければなりません(なお下の例ではdb_dump185を使用した)。実際にこれらすべてのコマンドを実行するのは不可能ではありませんが、少し大変かもしれません。そこでPerlスクリプトを使って一括実行すると楽になります(詳細後述)。

db_dump185 -f author.db.data author.db

db_dump185 -f comment.db.data comment.db

db_dump185 -f ipbanlist.db.data ipbanlist.db

db_dump185 -f placement.db.data placement.db

db_dump185 -f templatemap.db.data templatemap.db

db_dump185 -f blog.db.data blog.db

db_dump185 -f entry.db.data entry.db

db_dump185 -f log.db.data log.db

db_dump185 -f tbping.db.data tbping.db

db_dump185 -f trackback.db.data trackback.db

db_dump185 -f category.db.data category.db

db_dump185 -f ids.db.data ids.db

db_dump185 -f permission.db.data permission.db

db_dump185 -f template.db.data template.db

db_dump185 -f author.email.idx.data author.email.idx

db_dump185 -f ipbanlist.blog_id.idx.data ipbanlist.blog_id.idx

db_dump185 -f template.blog_id.idx.data template.blog_id.idx

db_dump185 -f author.name.idx.data author.name.idx

db_dump185 -f ipbanlist.ip.idx.data ipbanlist.ip.idx

db_dump185 -f templatemap.archive_type.idx.data templatemap.archive_type.idx

db_dump185 -f blog.name.idx.data blog.name.idx

db_dump185 -f log.created_on.idx.data log.created_on.idx

db_dump185 -f templatemap.blog_id.idx.data templatemap.blog_id.idx

db_dump185 -f category.blog_id.idx.data category.blog_id.idx

db_dump185 -f permission.author_id.idx.data permission.author_id.idx

db_dump185 -f templatemap.is_preferred.idx.data templatemap.is_preferred.idx

db_dump185 -f category.label.idx.data category.label.idx

db_dump185 -f permission.blog_id.idx.data permission.blog_id.idx

db_dump185 -f templatemap.template_id.idx.data templatemap.template_id.idx

db_dump185 -f comment.blog_id.idx.data comment.blog_id.idx

db_dump185 -f placement.blog_id.idx.data placement.blog_id.idx

db_dump185 -f template.name.idx.data template.name.idx

db_dump185 -f comment.created_on.idx.data comment.created_on.idx

db_dump185 -f placement.category_id.idx.data placement.category_id.idx

db_dump185 -f template.type.idx.data template.type.idx

db_dump185 -f comment.entry_id.idx.data comment.entry_id.idx

db_dump185 -f placement.entry_id.idx.data placement.entry_id.idx

db_dump185 -f trackback.blog_id.idx.data trackback.blog_id.idx

db_dump185 -f entry.author_id.idx.data entry.author_id.idx

db_dump185 -f placement.is_primary.idx.data placement.is_primary.idx

db_dump185 -f trackback.category_id.idx.data trackback.category_id.idx

db_dump185 -f entry.blog_id.idx.data entry.blog_id.idx

db_dump185 -f tbping.blog_id.idx.data tbping.blog_id.idx

db_dump185 -f trackback.created_on.idx.data trackback.created_on.idx

db_dump185 -f entry.created_on.idx.data entry.created_on.idx

db_dump185 -f tbping.created_on.idx.data tbping.created_on.idx

db_dump185 -f trackback.entry_id.idx.data trackback.entry_id.idx

db_dump185 -f entry.modified_on.idx.data entry.modified_on.idx

db_dump185 -f tbping.ip.idx.data tbping.ip.idx

db_dump185 -f entry.status.idx.data entry.status.idx

db_dump185 -f tbping.tb_id.idx.data tbping.tb_id.idx

mv author.db author.db.old

mv comment.db comment.db.old

mv ipbanlist.db ipbanlist.db.old

mv placement.db placement.db.old

mv templatemap.db templatemap.db.old

mv blog.db blog.db.old

mv entry.db entry.db.old

mv log.db log.db.old

mv tbping.db tbping.db.old

mv trackback.db trackback.db.old

mv category.db category.db.old

mv ids.db ids.db.old

mv permission.db permission.db.old

mv template.db template.db.old

mv author.email.idx author.email.idx.old

mv ipbanlist.blog_id.idx ipbanlist.blog_id.idx.old

mv template.blog_id.idx template.blog_id.idx.old

mv author.name.idx author.name.idx.old

mv ipbanlist.ip.idx ipbanlist.ip.idx.old

mv templatemap.archive_type.idx templatemap.archive_type.idx.old

mv blog.name.idx blog.name.idx.old

mv log.created_on.idx log.created_on.idx.old

mv templatemap.blog_id.idx templatemap.blog_id.idx.old

mv category.blog_id.idx category.blog_id.idx.old

mv permission.author_id.idx permission.author_id.idx.old

mv templatemap.is_preferred.idx templatemap.is_preferred.idx.old

mv category.label.idx category.label.idx.old

mv permission.blog_id.idx permission.blog_id.idx.old

mv templatemap.template_id.idx templatemap.template_id.idx.old

mv comment.blog_id.idx comment.blog_id.idx.old

mv placement.blog_id.idx placement.blog_id.idx.old

mv template.name.idx template.name.idx.old

mv comment.created_on.idx comment.created_on.idx.old

mv placement.category_id.idx placement.category_id.idx.old

mv template.type.idx template.type.idx.old

mv comment.entry_id.idx comment.entry_id.idx.old

mv placement.entry_id.idx placement.entry_id.idx.old

mv trackback.blog_id.idx trackback.blog_id.idx.old

mv entry.author_id.idx entry.author_id.idx.old

mv placement.is_primary.idx placement.is_primary.idx.old

mv trackback.category_id.idx trackback.category_id.idx.old

mv entry.blog_id.idx entry.blog_id.idx.old

mv tbping.blog_id.idx tbping.blog_id.idx.old

mv trackback.created_on.idx trackback.created_on.idx.old

mv entry.created_on.idx entry.created_on.idx.old

mv tbping.created_on.idx tbping.created_on.idx.old

mv trackback.entry_id.idx trackback.entry_id.idx.old

mv entry.modified_on.idx entry.modified_on.idx.old

mv tbping.ip.idx tbping.ip.idx.old

mv entry.status.idx entry.status.idx.old

mv tbping.tb_id.idx tbping.tb_id.idx.old

db_load -f author.db.data author.db

db_load -f comment.db.data comment.db

db_load -f ipbanlist.db.data ipbanlist.db

db_load -f placement.db.data placement.db

db_load -f templatemap.db.data templatemap.db

db_load -f blog.db.data blog.db

db_load -f entry.db.data entry.db

db_load -f log.db.data log.db

db_load -f tbping.db.data tbping.db

db_load -f trackback.db.data trackback.db

db_load -f category.db.data category.db

db_load -f ids.db.data ids.db

db_load -f permission.db.data permission.db

db_load -f template.db.data template.db

db_load -f author.email.idx.data author.email.idx

db_load -f ipbanlist.blog_id.idx.data ipbanlist.blog_id.idx

db_load -f template.blog_id.idx.data template.blog_id.idx

db_load -f author.name.idx.data author.name.idx

db_load -f ipbanlist.ip.idx.data ipbanlist.ip.idx

db_load -f templatemap.archive_type.idx.data templatemap.archive_type.idx

db_load -f blog.name.idx.data blog.name.idx

db_load -f log.created_on.idx.data log.created_on.idx

db_load -f templatemap.blog_id.idx.data templatemap.blog_id.idx

db_load -f category.blog_id.idx.data category.blog_id.idx

db_load -f permission.author_id.idx.data permission.author_id.idx

db_load -f templatemap.is_preferred.idx.data templatemap.is_preferred.idx

db_load -f category.label.idx.data category.label.idx

db_load -f permission.blog_id.idx.data permission.blog_id.idx

db_load -f templatemap.template_id.idx.data templatemap.template_id.idx

db_load -f comment.blog_id.idx.data comment.blog_id.idx

db_load -f placement.blog_id.idx.data placement.blog_id.idx

db_load -f template.name.idx.data template.name.idx

db_load -f comment.created_on.idx.data comment.created_on.idx

db_load -f placement.category_id.idx.data placement.category_id.idx

db_load -f template.type.idx.data template.type.idx

db_load -f comment.entry_id.idx.data comment.entry_id.idx

db_load -f placement.entry_id.idx.data placement.entry_id.idx

db_load -f trackback.blog_id.idx.data trackback.blog_id.idx

db_load -f entry.author_id.idx.data entry.author_id.idx

db_load -f placement.is_primary.idx.data placement.is_primary.idx

db_load -f trackback.category_id.idx.data trackback.category_id.idx

db_load -f entry.blog_id.idx.data entry.blog_id.idx

db_load -f tbping.blog_id.idx.data tbping.blog_id.idx

db_load -f trackback.created_on.idx.data trackback.created_on.idx

db_load -f entry.created_on.idx.data entry.created_on.idx

db_load -f tbping.created_on.idx.data tbping.created_on.idx

db_load -f trackback.entry_id.idx.data trackback.entry_id.idx

db_load -f entry.modified_on.idx.data entry.modified_on.idx

db_load -f tbping.ip.idx.data tbping.ip.idx

db_load -f entry.status.idx.data entry.status.idx

db_load -f tbping.tb_id.idx.data tbping.tb_id.idx

chmod 666 ./*

Perlスクリプトを使った一括実行については、次のサイト(のコメント)で紹介されています。

PARADISE STREET: ログインできなくなってた

私は独自の「DBをアップグレードするPerlスクリプト」を作りました。このPerlスクリプトは、次のリンクからダウンロードできます。自由にダウンロードして使ってください。

ダウンロード「MT Berkeley DB Updater(db_dump版)」zip版tar.gz版

ダウンロード「MT Berkeley DB Updater(db_dump185版)」zip版tar.gz版

ダウンロードしたファイルを解凍すると、「updatedb.pl」もしくは「updatedb185.pl」というPerlスクリプトが作成されます。このPerlスクリプトを実行するには、PerlスクリプトをDBのあるフォルダにコピーしたうえで

$ perl updatedb.pl

もしくは

$ perl updatedb185.pl
のようにコマンド入力してください。

実際にアップグレードされたファイルが画面上に表示されます。もし何も表示されずに「All done.」と表示された場合には、何も処理されていません(その場合、おそらくPerlスクリプトのあるディレクトリ内にDBファイルがないと思われます)。