« また民主党自爆 | メイン | テポドン2 »

2006年06月18日

iswebでエクスポートが失敗する件の対策 [MovableType]

isweb鯖だけの問題だと思うが、
エントリ数が300を超えるとWeblogの「読み込み/書き出し」において
途中で終了してしまう現象がある。

たとえば、500を超えるエントリを書き出ししても、300くらいで終わってしまい、
何回やっても全エントリが取れない、ということが起こる。
読み込みに関してはエントリのサイズによっては1つしか読めないこともある。

とりあえず書き出しできないことにはブログのバックアップにもならんので、
分割エクスポートの方法を考えてみた。

といはいってもたいしたことじゃなくて。

ブラウザ出力でエントリを得ようとすると途中でタイムアウトするので、
テンプレートでエクスポート用のHTMLを作成し、ファイルに書き出させる方法をとったのだが、
それでも途中で終わる(InternalError500がでる)ので、
全エントリをブロック分けして書き出させ、FTPでDLするというもの。

export.jpg

書き出しのためのテンプレートはこれを使う


<MTEntries lastn="200">
AUTHOR: <$MTEntryAuthor strip_linefeeds="1"$>
TITLE: <$MTEntryTitle strip_linefeeds="1"$>
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"$>
-----
BODY:
<$MTEntryBody convert_breaks="0"$>
-----
EXTENDED BODY:
<$MTEntryMore convert_breaks="0"$>
-----
EXCERPT:
<$MTEntryExcerpt no_generate="1" convert_breaks="0"$>
-----
KEYWORDS:
<$MTEntryKeywords$>
-----
<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>

画面みたくテンプレートを作成、エントリ数の指定のオフセットとファイル名を変えていけば、
全エントリのバックアップが鯖上にできる。これをFTPでDLすればOK。

<MTEntries lastn="200"> → <MTEntries lastn="200" offset="200">

こうすることで、次の200エントリの出力になる。
ただしファイル名を変えておかないと上書きされるので注意。

出力が成功したらローカルに保存してマージすれば全エントリのバックアップになるが、
iswebの場合、大量のエントリを「読み込み」しようとしても途中で止まってしまうので
分割しないといけない。

いくつに分割すればOKなのか?というのが問題なのだが、それが不定だから困る。
よって自分の場合は下記のスクリプトを使って全エントリをすべて単独のエントリに分解することにした。


#!/usr/local/bin/perl

use strict;

my($spl, $fi, $fo);
my(@buff, $cu, $c, $max);

$fi = "mt.txt";
$fo = "split/mt_%03d.txt";
$spl = "--------";
$max = 1;

@buff = ();
$cu = 0;
$c = 1;
open(IN, $fi) or die "open error $fi";
while(<IN>) {
chop;
push(@buff, $_);
if ($_ eq $spl) {
$cu++;
}
if ($cu == $max) {
&fout(\@buff, $fo, $c++);
@buff = ();
$cu = 0;
}
}
close(IN);
print "Content-type: text/html; charset=EUC-JP\n\n";
print "<html><body>split complete.</body></html>\n";
exit(0);

sub fout($$$) {
my($buff, $fo, $c) = @_;
my($foo);

$foo = sprintf($fo, $c);
open(OUT, ">$foo") or die "open error $foo";
foreach (@{$buff}) {
print OUT $_. "\n";
}
close(OUT);
}

__END__;

このスクリプト、どっかのHPにあったものなのだが出典がわからなくなってしまった。
出所不明で申し訳ないが、とりあえず動作はしている。

使い方

・全エントリを1ファイルにまとめる(ファイル名 mt.txt)
・スクリプトとmt.txtを同一ディレクトリに置き、配下にsplitディレクトリを作成
・スクリプトを実行するとsplitディレクトリ内にmt001.txtから連番で全エントリが個別ファイルに分割される
・Weblogにリストアするときは、$MTDIR/importディレクトリを作成し、そこにsplitされたファイルをすべてULする。
・その上で、Weblogの読み込みを実行すれば1エントリずつDBに書き戻してくれるので、iswebのタイムアウトに引っかからずにリストアができる

この方法考え付くまでにDBごと全部バックアップ・リストアしてたorz


by Daryl 2006年06月18日 06:53 | Permalink

トラックバック

このエントリーのトラックバックURL:
http://delta-j.web.infoseek.co.jp/cgi-bin/mt/mt-tb.cgi/739

コメント

はじめまして
iswebのサーバーエラーがなんとかならないものかと色々ググってこちらにたどり着きました。

分割エクスポート&インポートという方法に納得しつつ試してみるも、分割インポート中に動作がとまるというisweb。つきあいが長いとはいえ大きなため息がでます…。

その間のデータの非難場所にと、OCN会員の無料ブログスペースにインポートしたところ、素のmt.txtをとてもスムーズにインポートしてくれました。スタイルシートやテンプレートをいじるのじゃなければここでいいのに、と思いつつも、苦難を乗り越える度にcgiなどの知識を増やしてくれるiswebに感謝、しないと割に合わないなあとかなんとか。

by Massima : 2006年09月21日 22:16

いやーほんとまいりますね、iswebには。
CPU負荷制限きつすぎ(;´Д`)
ちょっとCGI動かせば即coreダンプですから。
じゃあロリポやxreaならいいのか、っていうとそうでもないし。

by Daryl : 2006年09月22日 02:31

情報&テンプレートありがとうございました。
タイムアウトで書き出せず、困っていたところに目からウロコです。
私はNext Style(WADAX)を利用していましたが、サーバタイムアウトはこちらと同様です。。。

by tawagoto : 2007年02月07日 17:45

鯖のタイムアウト短いと困りますね
他にも似たような環境の人がいたら教えてあげてください

by Daryl : 2007年02月08日 21:42

こちらの、最新エントリー書き出しテンプレート、これを使って無事に自分のブログのエントリーを書き出せました。自分の利用しているプロパイダーのサーバーがしょぼいのか、再構築さえも出来無いサーバーからでは、書き出しも三分の二しか出来無いです。そこで、書き出しテンプレートと併せて、全エントリーの書き出しに成功しました。今は、無事にバージョン4への移行が出来ました。書き出しテンプレートのお陰です。

たくさん、いっぱい、ありがとうございました。

by uzura : 2008年02月09日 07:40

書き出しもままならない鯖でMT4がちゃんと動きます?
自分の場合はそれ以前の問題でMT4に移行できないわけですが。。。
(isweb鯖はバークレーDBしか使えないため)

by Daryl : 2008年02月11日 07:49

ありがとうございます、コメントに返信。uzuraと言います。
たぶん、動かないと思うです、真っ当には。プロパイダー側は「mt4も平気です」とか言っているのですが、あてになんかは、全然に出来ません。

なので、へっぽこな自サバに入れてみました。しかし、再構築に十五分くらいかかります(記事は530件くらい、mt4にて)。それくらいは、普通なのか?さすがは(処理のろのろな)自サバなのか?

by uzura : 2008年02月11日 12:41

再構築に15分って・・・Seasaaとタメはる遅さですな。。。
あ、530件分か。。なら普通かも?

by Daryl [TypeKey Profile Page] : 2008年02月11日 21:56

コメントしてください




保存しますか?