저장소를 구축하고 프로젝트 소스가 커밋되기 시작했다면 저장소 백업을 수행해야 한다. 소스는 프로젝트의 가장 중요한 산출물이므로 저장소의 백업은 이중 삼중으로 수행하여 만약에 발생할 지 모를 위험에 대비해야 한다.

백업 파일은 저장소가 있는 서버외에 별도의 서버에 분리하여 저장을 해야 하며 이 요구사항에 맞게 백업 정책을 수립하고 적절한 툴을 선정해야 한다.

Acronis 사의 TrueImage 같은 전문 백업 솔루션이 없더라도 직접 svn 저장소를  백업할 수 있는 방법은 여러가지 가 있으며 기본적인 svn 내장 명령어를 통해 백업할 수 있는 여러가지 방법을 살펴보자.

 

svnadmin dump

저장소를 통째로 덤프하는 관리자용 유틸리티이다. 기본적으로 표준 출력으로 덤프되지만 파이프를 이용하여 저장할 파일을 지정할 수 있다.  복구는 svnadmin load 명령어로 저장소를 복구할 수 있다.

사용법svnadmin dump REPOS_PATH

옵션으로는 -r LOGWER[:UPPER] 형식으로 dump 할 revision 의 구간을 지정할 수 있다.

revision을 나눠서 덤프할 경우 해당 revision 내에서 svn copy나 mv 를 수행했는데 참고하는 revision이 구간내에 없으면 load 시에 문제가 발생할 수 있다.

svnadmin dump -r 1000:2000 /svnroot > myrepos-1000,2000.dmp

단점은 local 저장소만 덤프가 가능하므로 덤프된 파일을 스크립트등을 통해 FTP/SFTP/HTTP 등을 이용하여 별도의 백업 서버로 옮기거나 NFS 로 마운트한 디렉터리에 백업을 작성해야 한다.


덤프한 백업 파일 복구는 svnadmin load REPOS_PATH 로 수행할 수 있다.

# 복구할 저장소 생성
svnadmin create /var/svn/restore-repos

# 파일로부터 저장소 복구
svnadmin load /var/svn/restore-repos  < ~/repos-back.dmp
BASH


 

svnadmin hotcopy

저장소의 모든 이력과 hook 스크립트, 설정 파일을 모두 복제하는 명령어이다.

사용법svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH

단점으로는 점진적인 백업 기능이 없으므로 모든 리비전을 다  복제해야 하므로 리비전이 많은 저장소의 경우 백업 및 복구 시간이 오래 걸릴수 있다. 저장소가 있는 서버에서 수행해야 하며 dump 와 달리 저장소의 구조를 복제하므로 원격지에 백업할 경우 dump하여 단일 파일로 만들거나 NFS 로 마운트된 디스크에 hot copy 를 수행해야 한다.

 

svnsync

원격지에 있는 저장소를 지원하며 점진적인 백업을 지원하므로 리모트에 있는 저장소를 백업하기에 가장 적당한 방법이다. 

 

백업 설정


환경

svn 사용 환경은 다음과 같다. 192.168.0.10 이 svn 서버이고 20번에서 svnsync 로 백업을 수행할 예정이다.

Svn Server(svn.example.com)192.168.0.2
Backup Server(backup.example.com)192.168.0.3

복제 저장소에서 커밋이나 기타 리비전이 변경되는 작업을 수행하면 이후 복제 작업이 실패할 수 있으므로 복제 저장소에서 커밋등의 작업을 수행하지 않도록 주의해야한다.

    

설정

https://svn.example.com/svn 저장소를 Backup Server(192.168.0.3)의 /var/backup/svnbackup/repos 에 백업하기로 하였다. 먼저 백업서버에 백업을 수행할 계정(backup)으로 로그인한후에 다음 명령어를 수행한다.

  1. 복제할 저장소를 생성한다.

    svnadmin create /var/backup/svnbackup/repos

  2. 리비전 정보가 추가/수정/변경때 호출되는 hook 스크립트를 생성해야 한다. 에디터로 /var/backup/svnbackup/repos/hooks/pre-revprop-change 을 열어서 다음 내용을 추가하고 저장한다.

    #!/bin/sh
    exit 0;
    CODE
  3. hook 스크립트에 실행 속성을 부여한다.

    chmod +x /var/backup/svnbackup/repos/hooks/pre-revprop-change

  4. 저장소 복제를 하기 위해 svnsync init 명령을 한 번 수행해야 한다. 옵션으로 복제할 저장소의 URL과 원저장소의 URL 을 입력한다.

    svnsync init file:///var/backup/svnbackup/repos https://svn.example.com/repos

  5. svnsync 복제를 시작한다.

    svnsync sync file:///var/backup/svnbackup/repos

    Committed revision 0.
    Copied properties for revision 0.

cron 에 등록

svnsync 가 정상적으로 동작하는걸 확인했다면 리눅스용 작업 스케줄러인 cron 에 등록하여 자동으로 저장소 복제를 수행하면 된다. cron 은 실행시 환경 변수를 가져오지 않으므로 수행할 명령어를 직접 cron 의 실행 부분에 넣는 것 보다는 실행 스크립트를 따로 만들고 이 스크립트를 크론에 등록하여 동작시키는게 더 안전하다.

  1. svnsync 스크립트 작성을 위해 에디터로 /usr/local/sbin/svnbackup.sh  파일을 연다.

  2. 다음 내용을 추가하고 저장한다.

    #!/bin/sh
    
    svnsync sync file:///var/backup/svnbackup/repos
    CODE
  3. 크론에서 실행할수 있게  실행 속성을 부여한다.

    chmod +x /usr/local/sbin/svnbackup.sh

  4. 쉘상에서 작성한 스크립트를 수행하여 정상 동작 여부를 확인한다.

    /usr/local/sbin/svnbackup.sh

    Committed revision 3.
    Copied properties for revision 3.

  5. 정상 동작이 확인되었으니 스크립트를 cron 에 등록하여 정해진 시간마다 저장소를 백업하자. crontab -e 명령어로 크론의 스케줄 편집기를 구동한다. 다음은 매일 오전 8시부터 오후 23시까지 한 시간마다 백업을 수행하는 설정이다.

    0 8-23 * * * /usr/local/sbin/svnbackup.sh

  6. 에디터에서 내용을 저장하고 나오면 크론의 스케줄에 반영된다. crontab -l 명령어로 현재 등록된 스케줄링 작업을 확인할 수 있다.
     

     

백업 여부 확인

svn log 명령어로 저장소의 로그 내역을 조회하여 최근 커밋 내역이 저장소로 복제되고 있는지 확인할 수 있다. -l(limit) 옵션은 최근 로그중에 지정한 갯수만큼 로그를 출력한다.

svn log file:///var/backup/svnbackup/repos -l 5