Восстановление репозитория SVN из резервных копий

Я использую скрипт Дуга Хеллманна для резервного копирования моего репозитория уже 2 года, и в конце концов я потерял жесткий диск своего сервера. Поэтому я создал новый репозиторий на другом компьютере и попытался выполнить команду восстановления, а именно:

gunzip -c `ls -tr dump*` | svnadmin load /home/svn/myproject

Только это не работает. Это дает ответ

<<< Started new transaction, based on original revision 917
svnadmin: File not found: transaction '0-1', path 'MineSweeper2/src/com/bytezone/minesweeper2/Game.java'
     * editing path : MineSweeper2/src/com/bytezone/minesweeper2/Game.java ...denis@ubuntu-lianli:~/SVN backups$

Кто-нибудь может объяснить, что здесь не так? У меня есть все когда-либо сделанные инкрементные резервные копии, конечно, это самый простой сценарий.

Между прочим, возможно ли сжать дюжину или около того файлов резервных копий в один файл перед попыткой загрузки?


person dmolony    schedule 13.11.2011    source источник


Ответы (2)


Кажется, что резервные копии не обрабатываются в правильном порядке. svnadmin load воспроизводит коммиты, сделанные в репозитории, для получения новой копии. Кажется, он хочет зафиксировать модификацию файла, но файл еще не создан, потому что коммиты не в правильном порядке.

person madth3    schedule 13.11.2011
comment
Они должны быть в правильной последовательности (из-за опции -t), но я сначала скопировал их на новый сервер, так что, возможно, изменился порядок меток времени. На самом деле я не могу сказать, потому что все они теперь имеют одинаковую отметку времени. - person dmolony; 13.11.2011
comment
Я видел много операций копирования, которые не учитывали порядок при копировании нескольких файлов. Вы не можете использовать алфавитный порядок? Что произойдет, если запустить первые дампы один за другим? - person madth3; 13.11.2011
comment
Спасибо. Я «пощупал» каждый из файлов по порядку, и теперь это работает. - person dmolony; 13.11.2011

Мне пришлось бросить быстрый взгляд на его сценарий. Похоже, вы делаете файл дампа только для изменений, которые произошли с момента последнего дампа, а затем сжимаете их.

В этом случае должна быть возможность распаковать все сжатые резервные копии, а затем соединить их вместе в правильном порядке, чтобы создать один допустимый файл дампа.

Это в правильном порядке является ключевым. Похоже, он сохраняет диапазон ревизий в имени файла дампа, но номера ревизий не заполнены нулями, что означает, что сортировка по именам файлов может быть проблемой.

Можно отсортировать файлы дампа на основе cdate или mdate файла резервной копии, но это довольно рискованно.

Имя файла дампа — ${dumpfilename}-${repo_name}-${first}-${last}.${compress_ext}, поэтому можно использовать - в качестве разделителя полей и выполнять численную сортировку по третьему полю.

sort -t - -k3,3n

Это расставит их в правильном порядке. Тогда вы можете сделать что-то вроде этого:

ls | sort -t - -k3,3n | while read backup
do
    bzcat $backup | svnadmin load $repos
done

Конечно, это совершенно не проверено, потому что я не пробовал сценарий Дуга Хеллманна, но это должно быть довольно близко. Вы можете объединить все в один дамп, выполнив следующие действия:

ls | sort -t - -k3,3n | while read backup
do
   bzcat $backup >> $dumpfile
done

Надеюсь, это сработает. Или, по крайней мере, направляет вас в правильном направлении.

person David W.    schedule 13.11.2011
comment
Спасибо. Я заставил его работать, изменив метки времени вручную, но было бы проще, если бы имена были заполнены нулями (как вы предложили) и если бы команда восстановления сортировалась по имени. Я попробую комбинированный шаг, который вы предложили. - person dmolony; 13.11.2011
comment
Это один из случаев, когда Kornshell работает лучше, чем Bash. В Kornshell вы можете использовать typeset для объявления переменной фиксированной ширины, заполненной нулями. Вы делаете typeset -Z first, и это решит проблему. В Bash вы можете использовать printf для форматирования first так, чтобы оно было заполнено нулями, и это действительно помогло бы. Это незначительное изменение, но оно значительно облегчило бы восстановление. По крайней мере, вам не придется делать фанк sort, чтобы привести все в правильный порядок. ls сделает это за вас автоматически. Я предлагаю это автору. - person David W.; 13.11.2011