Назад | Перейти на главную страницу

Как сделать пошаговое резервное копирование репозиториев SVN

Как я могу сделать резервную копию репозиториев SVN шаг за шагом .... я хочу сделать резервную копию самого репозитория .... я не хочу делать резервную копию его как папки ....

шаг 1 Создайте сценарий или командный файл, который запускает команду

svnadmin dump REPOS_PATH > backupfile

svnadmin - это программа, которая поставляется с svn, она будет в папке bin

backupfile - это файл, в который будет выгружен репозиторий

REPOS_PATH - расположение репозитория

видеть http://svnbook.red-bean.com/en/1.1/re31.html Больше подробностей

шаг 2. Запустите сценарий / пакетный файл, чтобы проверить резервную копию.

шаг 3. Убедитесь, что резервная копия работает, запустив команду

svnadmin load test_path < backupfile

Теперь попробуйте репозиторий, созданный в test_path, чтобы убедиться, что он работает нормально - он должен и в качестве бонуса должен работать с более новыми версиями svn.

Следуя сценарию, который можно сохранить как: svnbackup.sh

    #!/bin/bash

appname=`basename $0`

#
# Set some defaults
#
increment=100
start=""
default_history_file="last_saved"
history_file=""
dumpfilepath="."
dumpfilename="dumpfile"
verbose=false
sshopts=""
identity=""

#
# Function to explain how to use the program
#
function usage () {
    echo
    echo "$appname [-h]"
    echo "$appname [-v] [-i increment] [-s start_rev] [--scp remote] [--identity ssh-key] [--ssh-opts ssh options] [--history-file file] [--out-dir directory name] [--compress (gzip|bzip2)] [--file-name dumpfile-base-name] svn_repository_path"
    cat - <<EOF

This script dumps a subversion repository to a series of compressed
files.  It uses a local file to remember the last changeset dumped so
the script can be used to generate files for backups.

Using the --scp option, the backup files can be generated on one
machine and copied to a backup server once dumped.

  -v             -- Verbose mode
  -i increment   -- How many revisions to include in each dump file.
  --file-name base -- Base name for dump files, defaults to "dumpfile".
  -s start_rev   -- First revision to dump.
  --scp remote   -- Location for remote backups.  Files are transfered via scp,
                    then removed from the local directory.
  --identity     -- Identity file for scp transfer
  --ssh-opts      -- options to use for scp
  --history-file -- path and filename of historyfile to use
  --out-dir      -- path where svn dump files should be written, defaults to "."
  --compress     -- compression method (gzip or bzip2, defaults to bzip2)
EOF
    echo
    echo "Example:"
    echo "  $appname -v -i 100 --scp user@backupserver:/backups/svn /svn/Project"
    echo
    exit $1
}

compress_app="bzip2"
compress_ext="bzip2"

#
# Process arguments
#
while [ $# -gt 0 ]
do
    opt="$1"
    case "$opt" in
        -h) usage 0;;
        -i) increment=$2;
            shift;;
        -s) start=$2;
            shift;;
        --scp) dest="$2"; 
            shift;;
        --identity) identity="$2";
            shift;;
        --ssh-opts)  sshopts="$2";
            shift;;
        --history-file) history_file="$2";
            shift;;
        --out-dir) dumpfilepath="$2";
            shift;;
        --file-name) dumpfilename="$2";
            shift;;
        -v) verbose=true;;
        --compress)
            case "$2" in
                bzip2|bz|bzip) 
                    compress_app="bzip2"; 
                    compress_ext="bzip2";;
                gzip|gz)
                    compress_app="gzip";
                    compress_ext="gz";;
            esac;
            shift;;
        *) break;;
    esac
    shift
done

repository="$1"
if [ -z "$repository" ]
then
    echo "Failed: Repository argument required"
    usage 1
fi

if [ -z "$history_file" ]
then
    history_file="$dumpfilepath/$default_history_file"
fi

if [ "x${start}" = "x" ]
then
    # if [ -s $history_file ]              #Blocco Rinominato per NON Tenere Conto Last_saved
    # then
        # loop_first=`cat $history_file`
    # else
        # loop_first=0
    # fi
     loop_first=0
else
    loop_first=$start
fi
youngest=`svnlook youngest "$repository"`

$verbose && echo "Backing up: $repository"
$verbose && echo "      From: $loop_first"
$verbose && echo "        To: $youngest"
if [ "$dest" != "" ]
then
    $verbose && echo "      Dest: $dest"
fi
if [ "$identity" != "" ] ; then
    $verbose && echo "  Identity: $identity"
fi
if [ "$sshopts" != "" ] ; then
    $verbose && echo "  ssh opts: $sshopts"
fi
$verbose && echo "Hist. file: $history_file"
$verbose && echo "Chunk size: $increment"

#
# Function to do the backup for one set of revisions
#
function backup_revs () {
    typeset first=$1
    typeset last=$2
    typeset repo=$3

    if [ "$first" != "0" ]
    then
        incremental="--incremental"
    fi

    repo_name=`basename "$repo"`
    dumpfile="$dumpfilepath/${dumpfilename}-${repo_name}-${first}-${last}.${compress_ext}"

    $verbose && echo -n "Dumping ${first}:${last} ..."

    svnadmin dump -q "$repo" $incremental --revision ${first}:${last} \
        | "$compress_app" > "$dumpfile"
    RC=$?

    $verbose && echo

    if [ $RC -ne 0 ]
    then
        rm -f "$dumpfile"
        return $RC
    fi

    $verbose && echo "Created $dumpfile"

    if [ "$dest" != "" ]
    then
        if [ -z "$identity" ] ; then
            scp $sshopts "$dumpfile" "$dest"
        else
            scp $sshopts -i $identity "$dumpfile" "$dest"
        fi
        RC=$?
        rm -f "$dumpfile"
    fi

    return $RC
}

#
# Do the incremental dumps
#

if [[ $youngest -eq $loop_first ]]
then
    $verbose && echo "No new changesets to dump"
    exit 0
fi

let loop_last=($loop_first + $increment)

if [[ $loop_first -ne 0 ]]
then
    let loop_first=($loop_first + 1)
fi

while [[ $loop_first -le $youngest ]]
do

    if [ $loop_last -lt $youngest ]
    then
        # A full "increment"
        backup_revs $loop_first $loop_last "$repository" || exit 1
        #echo $loop_last > $history_file
    else
        # In case the last few revs do not make up a full "increment"
        backup_revs $loop_first $youngest "$repository" || exit 1
        #echo $youngest > $history_file
    fi

    let loop_first=($loop_last + 1)
    let loop_last=($loop_last + $increment)
done

exit 0
  1. Остановите сервер
  2. Скопируйте весь каталог, содержащий репо, хуки и файлы конфигурации.
  3. Скопируйте также свою конфигурацию Apache, если вы ее используете, и она все равно не хранится в указанном выше каталоге.

Это оно.

Вы можете восстановить данные на той же или подобной машине (например, windows -> windows). если вы хотите выполнить восстановление из Windows в Linux (скажем), то вместо этого вы захотите сбросить и загрузить репозиторий. Вам все равно нужно будет скопировать остальную часть каталога.

Хорошие предложения использовать rsync для копирования всего (но вам придется останавливать сервер, чтобы всегда получать хорошую резервную копию) или использовать svnsync, который является отличной утилитой инкрементного резервного копирования для SVN. (вам все равно придется скопировать хуки и конфигурацию - я rsync их и svnsync репо)

Просто создайте копию каталога svn.

Редактировать:

Как уже упоминалось - сначала нужно остановить svn-сервер.

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