subversion 은 repository 별로 관리가 가능하다.
 
사내에서도 몇개의 repository를 생성해서 관리를 하고 있는데
얼마전 버전관리 서버의 보드가 사망하는 일이 발생해서 백업의 중요성을 일깨워준 일이 있다.
 
Repository 백업을 위해 몇가지 방법을 찾아보니 svnsync 를 이용해서 repository 의 백업본을
만드는게 백업 및 복구가 용이하고 추가 장비도 필요없을거 같아서 별도의 물리적인 파티션에
기존 repository 들을 백업하기 위해 아래 스크립트를 작성하고 cron에 연동 시켜 놓았다.
 
혹시 백업 파티션도 날라갈까봐 메인 repository는 두 개의 백업 repository에 백업해 놓게 작성했으니 백업 파일을 주기적으로 물리적으로 백업까지 한다면 소스를 잃는 비극은 발생하지 않으리라고 본다. 

 

제약 사항

  • GNU bash 가 있어야 한다.
  • svn 관련 command line tools 이 설치되어야 한다.(svnadmin, svnsync 등)

 

  1. $SOURCE_REPOS_PARENT 를 백업을 수행할 svn repository 로 변경한다.

    하위에 실제 repository 가 있어야 한다

    예로 /export/home/svn_repos/ 밑에 다음과 같이 repository 가 위치할 수 있다.

    svn_repos
         - repos1
         - repos2
         - repos3 
  2. $TARGET_REPOS_DIR 를 생성한다. (실제 backup 이 이뤄질 폴더이다)
  3. svn_backup.sh를 init 옵션을 주고 실행한다.

    ./svn_backup.sh init 
    BASH
  4. 정상적으로 실행됐다면 $TARGET_REPOS_DIR 에 하위 repository가 생성되고 각 repository 의 hooks/pre-revprop-change 파일이 실행속성을 갖게 생성된다.
  5. svn_backup.sh sync 옵션을 주고 실행한다.

    ./svn_backup.sh sync
    BASH
  6. 정상적으로 동작하면 cron 등에 연계해서 특정 주기마다 백업을 수행하게 설정한다.

    매일 밤 23시에 repository 동기화

    0 23 * * * /usr/local/bin/svn_backup.sh 

 

backup repository 에 대해서 commit 을 수행하면 안 된다.

 

Backup script

svn_backup.sh

#!/usr/bin/env bash -x
 
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib
export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/ssl/lib:$LD_LIBRARY_PATH
 
## incremetal backup 을 수행할 svn repos path
SOURCE_REPOS_PARENT="/export/home/svn_repos/"
SOURCE_REPOS_PIRS=`ls ${SOURCE_REPOS_PARENT}`

## backup destination dir
TARGET_REPOS_DIR="/var/backup/repos_sync"
SVNSYNC=/usr/local/bin/svnsync

## 
ACTION=$1

if [ "A"$ACTION = "A""init" ];then
    for i in $SOURCE_REPOS_PIRS;do
        # 폴더 생성
        DEST="$TARGET_REPOS_DIR/$i"
        SRC="$SOURCE_REPOS_PARENT/$i"

        echo "src=$SRC, dest=$DEST"

        test ! -d $DEST && svnadmin create $DEST
        # hook script 생성
        cat <<'EOF' > $DEST/hooks/pre-revprop-change
#!/bin/sh
USER="$3"
ALLOW_USER="root"
if [ "$USER" = "$ALLOW_USER" ]; then exit 0; fi
echo "Only the $ALLOW_USER user can change revprops" >&2
exit 1
EOF

        #권한 변경
        chmod +x $DEST/hooks/pre-revprop-change
        ## svnsync initialize DEST_URL SOURCE_URL
        $SVNSYNC init --username root file:///$DEST file:///$SRC;
    done
elif [ "A"$ACTION = "A""sync" ];then
    for j in $TARGET_REPOS_DIR; do
        for i in $SOURCE_REPOS_PIRS;do
            # test repos 는 백업 안 함.
            if [ "A"$i = "A""test" ];then
                continue;
            fi;
            echo "Repository Sync.....$i to $j";
            $SVNSYNC sync file:///$j/$i;
        done
    done
else
    echo "parameter(init or sync) required"
    exit 1;
fi; 
BASH

 

 

 

svn_backup.sh sync 로 구동시 정상적인 실행 결과

Committed revision 652.

Copied properties for revision 652.

Transmitting file data .........

Committed revision 653.

Copied properties for revision 653.

Transmitting file data ...............