スポンサードリンク

2012年06月21日

【SVN】「No such revision xxxxx」リポジトリの特定リビジョンが消えたときの復旧方法

20120621-202511.jpg

ぐああああああ!!
Subversionで管理しているリポジトリの特定のリビジョンがピンポイントで壊れました。
これを復旧しなくてはいけません!

■復旧しない場合に起こる悲劇
1:エラーが出ているリポジトリパス以下は二度と参照できない
 ⇒もしrootでこのエラーが出たら全てのリポジトリが見られないという罠
2:svnadmin dumpで出力するSVNdumpが途中で1つ飛ぶので、dump入れなおすと途中から前の状態とリビジョンがズレだす(可能性)

■発生の経緯
1:HDDに不良セクタができる⇒このとき既にSVNでは上記のエラー
2:CHKDSKを実行する
3:問題のリビジョンの物理ファイルが消えてしまう
4:復旧せな ← 今ココ

20120621-202603.jpg

rev55844が消えてしまっているの図。

■復旧手段
まず準備するもの:リビジョンが壊れる前のバックアップ⇒svn_dumpとします
簡単にいうと、この場合55844が消えているので、
昔の綺麗な状態でバックアップ(svn_dump)からloadして復旧⇒最近コミットされたリビジョンを差分で追加
で回復できます。
そのためには、svn_dumpにどこまでのリビジョンが入っているか調べる必要があるので、まずはどこかにloadして、どこまで綺麗なリビジョンが残っているか確認してみましょう。

私の場合は56000まで残っていました。
あとはコマンド打つだけです。

■コマンド(windowsです)
rem 変数設定。MAXは現在の最大リビジョンを設定
set backuppath="C:\tracwork\recover"
set MAXrev="57000"

rem サービスの停止
net stop TracLightning
net stop Hudson
net stop MySQL

rem バックアップしながらtestリポジトリを消す
move C:\TracLight\projects\svn\test C:\TracLight\projects\svn\test_bk

rem ロックされていたらmoveでrenameされないのでここで確認
pause

rem rev56001以降のdmpをtest_bkから出力する(56000まではバックアップされている)
svnadmin dump C:\TracLight\projects\svn\test_bk -r 56001:%MAXrev% --incremental > %backuppath%\dump_from_56001

rem プロジェクト復活
svnadmin create --fs-type=fsfs C:\TracLight\projects\svn\test

rem dmpimport
svnadmin load C:\TracLight\projects\svn\test < %backuppath%\svn_dump
rem これでリビジョン56000まで入る

rem dmpimport2
svnadmin load C:\TracLight\projects\svn\test < %backuppath%\dump_from_56001
rem これでリビジョン56001から入る

rem hooksの復旧
xcopy /c /s /e /q /h /i /k /r /y C:\TracLight\projects\svn\test_bk\hooks C:\TracLight\projects\svn\test\hooks

rem サービスの起動
net start MySQL
net start TracLightning
net start Hudson

これで消えたリビジョンは復旧できます。
作業中はLAN線を抜きましょう。途中でコミットされたらやり直しです。
作業後は確認も忘れずに。
posted by hinata_hisa at 21:23 | 東京 ☀ | Comment(0) | IT関係 | このブログの読者になる | 更新情報をチェックする