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

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

    매일 밤 23시에 repository 동기화

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

 

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

 

Backup script

#!/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; 

 

 

 

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 ...............





blog comments powered by Disqus