2014年4月16日水曜日

Subversionのリポジトリを復旧(再構築)

 Subversionのリポジトリが壊れていることにはずいぶん以前——WindowsXPからFreeBSD8.3に移行したときに気づいた。途中のリビジョンが破損しているらしく、あるところから過去へ遡れない。たとえば「svnadmin verify」をかけてみると、次のようになる。

(中略)
* リビジョン 666 を検証しました。
* リビジョン 667 を検証しました。
* リビジョン 668 を検証しました。
svnadmin: E160006: リビジョン 669 はありません

 直近からの2000リビジョン分ほどは見れるし、チェックインもできるのでそのまま、使っていたのだが、どうも気になる。ゼロからやりなおすなり、再構築するなり、しないといけないなぁ、とは思っていたのだが、ようやくやる気になった。
 「svnadmin recover」をかけてみたが、案の定、リカバリーできなかった。内部データはバイナリで手作業での復旧は無理そうだ。ググってみてもそれらしいサイトにぶつからなかった。
 マニュアル片手に方法を考えた。

「svnadmin dump リポジトリ -r 0:668 > dump001」で先頭部分をダンプアウト。

 次に「svnadmin dump リポジトリ -r $1 –incremental > deump$1」というシェルスクリプトをつくって669〜3328まで差分ダンプを出力。ここで問題のあるリビジョンは正常にダンプされないので、正常にダンプしたデータだけを順番に「svnadmin load 新規リポジトリ」に喰わせてリポジトリを再構築した。
 最終的に「svnadmin verify」で確認したが、問題はないようだった。隅々までだいじょうぶかは不明だが——案の定、あるファイルが古いようだった。このファイルをいじったときにリビジョンが問題だったのだろう。
 リポジトリのサイズは868.3MBから430.4MBになっていたので、半分のデータはふっ飛んでしまったということか……。