タグ別アーカイブ: subversion

svnのリポジトリを復旧する

私のsubversionリポジトリは、一定時間おきにsvnsyncでミラーリングかけることでバックアップしているのだけれども、このバックアップのスクリプトがエラーを出すようになってしまいました。バックアップ側にはこれといって問題はなさそうだったので、リポジトリの方を確認。

% svnadmin verify [path to repository]
* Verified version 1.
* Verified version 2.
....
* Verified version 2000.
svnadmin: Checksum mismatch:
expected: [xxxxx]
actual: [XXXXX] ← expectedと違う

どうも、データファイルが壊れているようなメッセージなので、リポジトリを復旧することにしました。壊れた部分のデータはバックアップ側にもなかったので諦めることに。。。

まずは、壊れていない部分をdumpします。

% svnadmin dump [path to repository] > svn.dump
* Dumped revision 1.
* Dumped revision 2.
...

壊れているバージョンがあれば、そこから先をdumpできない。例えば、ver.2001が壊れていたとすると、ver.2000までしかdumpされません。そこで、壊れているバージョンをskipして、その先の壊れていない部分のdumpデータを先に作っていたdumpファイルに追加します。例えば、ver.2001が壊れている場合、ver.2001をskipし、ver.2002からdumpしてファイルに追加します。

% svnadmin dump --incremental -r2002:HEAD [path to repository] >> svn.dump
* Dumped revision 2002.
* Dumped revision 2003.
...

あとは、作成したdumpデータを新しいリポジトリに登録すれば復旧完了です。

% svnadmin create [path to new repository]
% svnadmin load [path to new repository] < svn.dump

これで、壊れていない部分のデータについて復旧できます。ただし、壊れた部分のversion番号は詰められるので、壊れたデータの数だけversion番号が小さくなります。そのため、このリポジトリと同期しているファイルがある場合、version番号のずれによる不具合が起こる可能性があるので、新しくcheckoutした方が無難かも。

追記(2015/03/03):
もちろん、壊れた部分のデータも失われているので、何が失われたかを確認する必要がありますね。