User Tools

Site Tools


application_specific_backups:subversion_repositories

Subversion repositories

If you have one or several subversion repositories stored under the same folder, this script will help you to automatically back them up.
This script does a full dump for each repository if no previous dump was found or if the supplied parameter is “Base” or “Full”.
If neither is true, it does an incremental dump using a range of revisions going from the last revision of the full dump to the youngest found in the repository.

Warning: I have not tested a restore, please verify by yourself that this works :

#!/bin/bash

# paths to the svn root and where backups get dumped
svnroot=/var/lib/svn
dumptarget=/var/dumps/svn

# if you don't have multiple repos, set this to true
single_repo=false

if [ -n "$1" ]; then
    level=$1
    [ "$level" == "Base" ] && level=Full
else
    echo "Error : No Job level specified" >&2
    echo "Usage: `basename $0` [Base|Full|Incremental|Differential|Since]"
    exit 1
fi

# (more) secure umask
umask 0027

backup_repo() {
    dir=$1
    repo=$2

    # find out last revision for repository
    youngest=`svnlook youngest $dir`

    # Full dump, save last revision for next incrementals
    if [ ! -f "$dumptarget/$repo.full.gz" ] || [ "$level" == "Full" ]; then
        echo "Full dump of $repo (rev. $youngest)"
        svnadmin dump -q "$dir" | gzip > "$dumptarget/$repo.full.gz"
        echo $youngest > "$dumptarget/$repo.last"
        rm -f "$dumptarget/$repo.inc.gz"

    # Inremental backup if last revision in full dump found
    elif [ -f $dumptarget/$repo.last ]; then
        previous=`cat $dumptarget/$repo.last`
        oldest=$(($previous + 1))
        if [ ! "$previous" == "$youngest" ]; then
            echo "Incremental dump of $repo (rev. ${oldest}-${youngest})"
            svnadmin dump -q --revision $oldest:$youngest --incremental "$dir" | gzip > "$dumptarget/$repo.inc.gz"
        else
            echo "No changes in $repo (rev. ${youngest})"
            return 1
        fi
    else
        echo "Error : did not find last dumped revision ($repo.last file)" >&2
        exit 1
    fi
}

if $single_repo; then
    backup_repo "$svnroot" "repository"
else
    for d in `find $svnroot -mindepth 1 -maxdepth 1 -type d`; do
        backup_repo "$d" "`basename $d`"
    done
fi

exit 0

Include this in the Job ressource in bacula-dir.conf: (the job level is substituted for %l when bacula calls the script)

  RunScript {
    Runs on Client = Yes
    Runs When = Before
    Abort Job on Error = No
    Command = "/path/to/script/dump_svn %l"
  }

For more infos : http://svnbook.red-bean.com/nightly/en/svn.reposadmin.maint.html#svn.reposadmin.maint.migrate

application_specific_backups/subversion_repositories.txt · Last modified: 2010/03/02 01:38 by alkk