6月 15, 2012

tar.bz2なバックアップファイルが復元出来なかった(解決)

tar.bz2なバックアップファイルが復元出来なかった。
bzip2: Data integrity error when decompressing.
        Input file = (stdin), output file = (stdout)

It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.

You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files.

tar: アーカイブ中に予期せぬ EOF があります
tar: アーカイブ中に予期せぬ EOF があります
tar: Error is not recoverable: exiting now
70GBのファイルを20GBまで圧縮してあるのだが、どうやら壊れてしまったようだ。
bzip2recoverを使えということで、使ってみる。
   block 49998 runs from 108483591327 to 108485995530
   block 49999 runs from 108485995579 to 108488398408
   block 50000 runs from 108488398457 to 108490796940
bzip2recover: `all0609.tar.bz2' appears to contain more than 50000 blocks
bzip2recover: and cannot be handled.  To fix, increase
bzip2recover: BZ_MAX_HANDLED_BLOCKS in bzip2recover.c, and recompile.
50000ブロック以上には対応出来ないようだ。
コンパイルし直せとのこと。

http://www.bzip.org/
からソースをダウンロード

bzip2recover.cの真ん中ぐらいに
#define BZ_MAX_HANDLED_BLOCKS 50000
という記述があるので、これを増やすと良いらしい。

tar.bz2のファイルサイズは21,113,008,629なんだけど、どのくらいまで増やせば良いのだろう。
この進捗に表示されている108,490,796,940を調べてみる。
ソースを追いかけてみると、このfromとtoはbStartとbEnd、そして他の場所に
bStart[currBlock] = bitsRead;
という記述があることから、ビット表記らしい。
ファイルサイズをビット換算すると168,904,069,032。
8分の5ぐらいのところまで処理しているようなので、余裕を持って2倍にしてみる。
#define BZ_MAX_HANDLED_BLOCKS 100000
configureなどはないので、直接make。

再度bzip2recoverを実行。
ls
rec15610all0609.tar.bz2  rec31226all0609.tar.bz2  rec46842all0609.tar.bz2  rec62458all0609.tar.bz2  rec78074all0609.tar.bz2
rec15611all0609.tar.bz2  rec31227all0609.tar.bz2  rec46843all0609.tar.bz2  rec62459all0609.tar.bz2  rec78075all0609.tar.bz2
rec15612all0609.tar.bz2  rec31228all0609.tar.bz2  rec46844all0609.tar.bz2  rec62460all0609.tar.bz2  rec78076all0609.tar.bz2
rec15613all0609.tar.bz2  rec31229all0609.tar.bz2  rec46845all0609.tar.bz2  rec62461all0609.tar.bz2  rec78077all0609.tar.bz2
8万近いファイルが生成された。

これを結合しつつ展開
find . -name "rec*.bz2" | sort | xargs -n1 bzcat | dd bs=65536 | tar xvf -

all0609.pgbackup

bzcat: Data integrity error when decompressing.
        Input file = ./rec15012all0609.tar.bz2, output file = (stdout)

It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.

You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files.
どうやらrec15012all0609.tar.bz2がまだ壊れているようだ。
このファイルだけを再度bzip2recoverに掛けてみたが、エラーは消えず。
結局この部分だけを破棄することとなった。

0 件のコメント:

コメントを投稿