Ответить на комментарий

 

Инкрементальный бекап svn

SVN - наиболее распространенный и популярный вид vcs. Очень многие проекты используют именно его, и потеря данных оттуда хоть и не смертельна (наверняка у разработчиков есть все необходимое в рабочих копиях), но очень неприятна. Поэтому все же стоит озаботиться ведением бекапов.

Однако бесмысленно каждый день делать полные дампы репозитоиев, тем более svn позволяет легко делать инкрементальный бекап. Для себя я это решил двумя скриптами.

Первый: полный бекап - выполняется в моем случае раз в неделю.

#!/bin/sh
BACKUP_DIR=/home/backup/svn/
SVN_DIR=/var/svn # directory where repos located
DATE=`date +%Y_%m_%d-%H_%M`
 
################################
cd $SVN_DIR
 
for repo in *; do
        # skip non-dirs
        if [ -d $repo ]; then
                # preparing
                mkdir -p "$BACKUP_DIR/$repo/weekly/"
                NEWREV=`svn log -r head file://"$SVN_DIR/$repo"/ | egrep "r[0-9]+" | cut -d "r" -f 2 | cut -d " " -f 1`
                FILENAME="$repo-$DATE-$NEWREV.dump"
                FILEPATH="$BACKUP_DIR/$repo/weekly"
                # crearing dump
                svnadmin dump -q -r 0:$NEWREV "$SVN_DIR/$repo" > "$FILEPATH/$FILENAME"
                echo -n $NEWREV > "$BACKUP_DIR/$repo/svnrev"
                # compressing
                bzip2 "$FILEPATH/$FILENAME"
                # cleaning
                rm -f "$BACKUP_DIR/$repo/inc/"* 2> /dev/null
                find "$BACKUP_DIR/$repo/weekly/" -not -name "$FILENAME"* -and -type f | xargs rm -f
        fi
done

Второй - выполняется каждый день и сохраняет только те ревизии, которые были сделаны с момента последнего бекапа:

#!/bin/sh
BACKUP_DIR=/home/backup/svn/
SVN_DIR=/var/svn
DATE=`date +%Y_%m_%d`
 
################################
cd $SVN_DIR
 
for repo in *; do
        if [ -d "$repo" ]; then
                OLDREV=`cat $BACKUP_DIR/$repo/svnrev`
                NEWREV=`svn log -r head file://"$SVN_DIR/$repo"/ | egrep "r[0-9]+" | cut -d "r" -f 2 | cut -d " " -f 1`
                if [ $OLDREV != $NEWREV ]; then
                        OLDREV=$(($OLDREV+1))
                        mkdir -p "$BACKUP_DIR/$repo/inc/"
                        svnadmin dump -q -r $OLDREV:$NEWREV --incremental "$SVN_DIR/$repo" > "$BACKUP_DIR/$repo/inc/$repo-$OLDREV-$NEWREV.dump" || continue
                        bzip2 "$BACKUP_DIR/$repo/inc/$repo-$OLDREV-$NEWREV.dump" || continue
                        echo -n $NEWREV > "$BACKUP_DIR/$repo/svnrev"
                fi
        fi
done

Восстанавливать: сначала svnadmin load полного бекапа, потом - svnadmin load всех инкрементальных.

Ответить

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
КАПЧА