Mar 23, 2006

[Subversion] Subversion のリポジトリ破損

Subversion のリポジトリ(FSFS)が破損した。 Commit は出来るのだが、Update や Log を実行すると

REPORT request failed on '/repository/!svn/vcc/default'
REPORT of '/repository/!svn/vcc/default': 200 OK
というエラーが発生して処理が中断してしまう。 TortoiseSVN でも Subclipse でも発生したので、サーバ側の問題の模様。

原因

原因はリビジョンファイルの破損。 HDD のセクタが破損したことで $SVN_HOME/svndb/db/revs/ の中にある特定のファイルにアクセスできなくなっていた。 壊れていたリビジョンは最新のものではなく、少し古い(数日前)のものだった。 "svnadmin verify" コマンドでリビジョンの状態をチェックできる。

# svnadmin verify /home/svn/svndb/
         (SNIP)
* Verified ▒・▒吾с??222▒
* Verified ▒・▒吾с??223▒
* Verified ▒・▒吾с??224▒
* Verified ▒・▒吾с??225▒
* Verified ▒・▒吾с??226▒
* Verified ▒・▒吾с??227▒
* Verified ▒・▒吾с??228▒
svn: Can't read file '/home/svn/svndb/db/revs/229': 入力/出力エラーです
#
コマンドの実行結果が文字化けしているのはご愛敬といったところか・・・。

対処方法

今回は破損したリビジョンが数日前と比較的最近のものだったので、破損したリビジョンの一つ前の状態に戻すことにした。 手順は以下の通り。

  1. $SVN_HOME/svndb/db/revs から破損したリビジョン以降のリビジョンファイルを削除
  2. $SVN_HOME/svndb/db/revprops から↑で削除したものと同じ名前のファイルを削除
  3. $SVN?HOME/svndb/db/current を編集して、現在のリビジョンを削除後の最新リビジョンに変更

備考

破損したリビジョンだけを無かったことに出来ないか、と思い色々調べてみたがどうも難しそう。 Subversion では各リビジョンはファイルの差分情報しか持っていない。 そのため、破損したリビジョンで変更が加えられているファイルがその後のリビジョンでも変更されていると、破損したリビジョンを削除することは出来ない。 ツールなどでも復旧は出来ないようだ。 リビジョンファイルを一つずつ手で修正すれば良いのかもしれないが、膨大な量の修正が必要になることとバイナリファイルを修正するという 2 点から容易な作業ではない。 バックアップはお早めに、といったところか。

Posted in Subversion | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |