Upgrade subversion i DB_VERSION_MISMATCH
Po wykonaniu upgrade na subversion otrzymałem błąd o następującej treści, przy próbie wykonania jakiejkolwiek operacji (tu akurat przy użyciu programu svnadmin):
svnadmin: Berkeley DB error for filesystem ‘REPO/db’ while opening environment:svnadmin: DB_VERSION_MISMATCH: Database environment version mismatch
svnadmin: bdb: Program version 4.3 doesn’t match environment version
Rozwiązanie okazało się banalnie proste. Wystarczy wykonać polecenie: svnadmin recover REPO, gdzie REPO to ścieżka do repozytowium.
Taka mała uwaga - parę razy przytrafiło mi się mieć poważne problemy z bazą Berkeley, które pojawiały się np. w przypadku, gdy było sporo rewizji i danych, które były przechowywane. Najczęściej chodziło o pokombinowanie z UUID oraz recover’em repozytorium. Jednak zamienienie bazy Berkeley na system plikowy uwolniło mnie od wszelkich kłopotów. Dlatego poniżej zamieszczam sposób, jaki pozwala na przejście z bazy Berkeley na bazę plikową.
1. Zakładam, że znajdujemy się w katalogu, który mieści folder naszego repozytorium o nazwie REPO.
2. Wykonujemy zachowanie konfiguracji: cp -r REPO/conf .
3. Wykonujemy zrzut z repozytorium: svnadmin dump --incremental REPO > REPO.dump
4. Usuwamy repozytorium: rm -rf REPO
5. Zakładamy na nowym systemie plikowym: svnadmin create --fs-type fsfs REPO
6. Usuwamy nowe pliki konfiguracyjne: rm -rf REPO/conf
7. Przywracamy stare dobre ustawienia: mv conf REPO
8. Przywracamy rewizje repozytorium: svnadmin load REPO < REPO.dump
9. Usuwamy niepotrzebny juz plik: rm -rf REPO.dump
10. Cieszymy się repozytorium opartym na systemie plików.
A co do robienia zrzutów bezpieczeństwa z posiadanych repozytoriów. Poniżej dołączam prosty skrypt napisany w bash do wykonywania takiej operacji. Można podpiąc go na przyklad pod cron. Nie jest doskonały - nie sprawdza na przykład, czy wszystko idzie zgodnie z oczekiwaniami, więc można sobie dopisać zrzucanie logów z działania oraz sprawdzanie kodów powrotu.
#!/bin/sh
BACKUP_FOLDER=”/var/backup/svn”
REPOS_FOLDER=”/var/repos”
if test -d $BACKUP_FOLDER; then
echo “Backup folder: $BACKUP_FOLDER”;
for i in $REPOS_FOLDER/*; do
if test -d $i; then
if test -f $i/db/fs-type; then
DATE=`date +%Y-%m-%d`;
echo “Zrzut $i do $BACKUP_FOLDER/$i-$DATE.dump.gz”;
svnadmin dump –incremental $i | gzip -9c > $BACKUP_FOLDER/$i-$DATE.dump.gz
fi
fi;
done;
else
echo “Nie odnaleziono folderu backup: $BACKUP_FOLDER”;
fi