| Исправление порушившегося Subversion репозитория |
|
|
|
|
Эта статья совсем не о пользе бакапов, о их неоюбходимости писать в N+1 раз писать уже просто нету смысла. Как гласит пословица: Нету админов которым бакапы не нужны, есть только те которые еще их не делают. Так вот, и были они. Но так получилось, что репозитории Subversion туда не попали. Ну просто потому что были симлинокм на внешний раздел и были забыты... Вот такая моя халатность, за что и поплатился. Однако, как я уже сказал, сия печальная история с относительно счастливым концом совсем не про бакапы. А скорее про счастливый конец. Итак, как Вы уже поняли, порушился у меня раздел, достаточно серьезно порушился. Многое конечно повосстановилось, кое-что нет. Особо серьёзного там ничего не было, многие фильмы просто и без сожаления были удалены. Но вот случилось что там же оказались и SVN репозитории. И вот тут-то началось очень неприятно. Стандартный svnadmin verify говорит о проблеме, но вот восстановить что-либо с помощью svnadmin recovery оказалось совершенно не возможно. Почитал я множество статей в интернете про восстановление, и понял что все они пытаются все же воссоздать файлы ревизий, посмотрел на свои, где целые килобайты нулей, и понял что это безнадёжно. Оставалось одно - восстановить то что сохранилось. В некоторых было потеряно всего по 1-3 ревизии что совершенно не является страшным. И восстанавливал просто:
В итоге получал новый репозиторий, с меньшим количеством ревизий, но полностью рабочий. Когда была рабочая копия его, так еще и коммитил последнее состояние. Ну конечно требовался полный речекаут (checkout), поскольку номера ревизий изменились. Все бы хорошо, но дошёл я до одного, который посыпался весьма серьёзно. Коммитов там было около 600. Битые ревизии были иногда последовательны, иногда через одну. Но и это оказалось не самым главным. До сих пор я делал все руками - сохранял в нумерованные дампы, и загружал в новый... Добило меня следующее неприятное обстоятельство. Даже то что все инкрементальные дампы прошли корректно не гарантирует что все они будут загружены в новое место корректно - ведь последовательность нарушена, и существуют "дырки" в истории, в виде потерянных ревизий! Получается некоторые изменения ссылаются на другие прошлые, информации о которых у меня нету. Усугубляется все это тем, что при такой загрузке svnadmin load не работает атомарно и не гарантирует целостность репозитория! Это было выяснено эмпирическим путём. То есть если при загрузке произошла ошибка, не отказывается даже эта ревизия, происходит выход где она обнаружена. Дальнейшая заливка дампов, даже корректны уже может привести к новым ошибкам. Единственные выход который я нашёл в этой ситуации - перезаливать новый репозиторий всеми кусками сначала (разумеется создавая его заново). При этом, в том куске где была ошибка загрузки, проблемная ревизия также должна быть исключена, и дамп сделан снова (если это не крайняя ревизия, значит будет уже 2 дампа). На этом этапе, потратив несколько часов на выяснение всех деталей и обстоятельств стало понятно что вручную этот репозиторий мне не восстановить до седин. Было принято решение написать скрипт по автоматизации всех описанных действий. Забегая вперёд скажу что очень не зря, потому что общий прогон по данному репозиторию составлял в автоматическом режиме более 12 часов в среднем... Да, раз уж скрипт, было решено сохранить номера ревизий. Прежде всего, потому что на них есть внешние ссылки из багтрекера. Но также чтобы можно было не делать речекаута. Пропущенные ревизии просто заменяются коммитами ничего не значащего свойства (впрочем с понятным текстом об этом). При автоматизации, разумеется, было добавлено несколько проверок целостности получающихся результатов, и прочих мелких радостей. Ещё раз повторю - делайте копии, и да не даст вам Бог оказаться в такой же ситуации. Но если она все же случилась, можете воспользоваться моим скриптом. Если есть какие-то вопросы - пишите, постараюсь помочь. В заключение несколько слов о самом скрипте:
Ну и желаю всем удачи! |
| Автор: Павел Алексеев aka Pahan-Hubbitus |
| 15.04.2011 10:54 |
| Обновлено 16.04.2011 14:03 |
Последнее из блога
Последнее из блога






