10장 백업

이재홍 http://www.pyrasis.com 2007.10.27 ~ 2008.04.20

목차

운영 중인 Trac을 안전하게 백업하기

Trac과 Subversion 서버를 구축해서 사용을 하다 보면 서버의 장애가 발생할 수가 있습니다. 이런 사고에 대비하기 위해 백업을 해야 합니다. 백업을 해야 하는 부분은 두 부분으로 나눌 수 있습니다. 티켓 정보와, 첨부 파일이 저장되는 Trac 부분과, 소스 코드가 저장되는 Subversion 저장소입니다. 사람이 일일이 백업할 필요 없이 윈도우의 예약된 작업을 통해서 일정 시간이 되면 백업을 하도록 설정할 수 있습니다.

Apache에서 Trac이 작동 중일 때에도 안전하게 Trac 데이터베이스와 첨부 파일을 백업할 수 있도록 해주는 명령이 바로 trac-admin hotcopy 명령입니다. hotcopy 명령은 아래와 같이 사용합니다. 같은 컴퓨터상의 다른 하드디스크로도 복사할 수 있습니다.

C:\Python25\Scripts\trac-admin.exe C:\trac\example hotcopy D:\backup\trac\example

아래 백업 스크립트를 사용하면 편리하게 백업할 수 있습니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/PowerShell/trac-backup.ps1
  • 부록 CD 경로 : Scripts/PowerShell/

trac-backup.ps1

$backup_dir = "C:\Backup"
$trac_dir = "C:\trac"

new-item -path $backup_dir -type directory -force
new-item -path $backup_dir\trac -type directory -force

$today = (Get-Date).tostring('yyyyMMdd')+"."+(Get-date -uformat %j)

new-item -path $backup_dir\trac\$today -type directory -force

foreach ($item in get-childitem $trac_dir)
{
	if (test-path "$trac_dir\$item" -pathtype container)
	{
		C:\Python25\Scripts\trac-admin.exe $trac_dir\$item hotcopy $backup_dir\trac\$today\$item
	}
}

[int] $delete_day = (Get-Date -uformat %j) -30
Remove-Item $backup_dir\trac\*.$delete_day -recurse -force

$backup_dir 부분을 각자 상황에 맞게 수정합니다. 이 스크립트는 백업 디렉터리 아래에 20071216.350(년월일.줄리안 데이트) 형식으로 디렉터리를 만들고 그 아래에 trac-admin hotcopy 명령으로 각 Trac 데이터베이스를 복사합니다. 매일 매일 백업을 하면 백업 데이터가 무한정 늘어날 수 있기 때문에 30일이 지난 백업본은 삭제합니다. [int] $delete_day = (Get-Date -uformat %j) -30 부분에서 30이 날짜입니다. 이 부분도 각자 상황에 맞게 수정합니다.

TIP
쥴리안 데이트(Julian date)란? 1월 1일을 1로, 12월 31일을 365(윤년 366)으로 계산하는 방식입니다. 1년의 날짜를 1부터 순서대로 나열하는 방식을 쥴리안 데이트라고 합니다.

이 스크립트는 사람이 직접 실행하는 것이 아닌 윈도우의 예약된 작업을 통해서 하루에 한번씩 실행되도록 설정하면 됩니다.

  1. 제어판에서 → 예약된 작업 → 예약 작업 추가를 선택합니다. 그런 다음 작업 예약 마법사가 실행되면 다음을 눌러 넘어갑니다.


    그림 10-1 작업 예약 마법사

  2. Windows PowerShell을 선택합니다.


    그림 10-2 실행할 프로그램 선택

  3. 작업 이름은 svn backup으로 지정하고 작업 실행은 매일(D)를 선택합니다.


    그림 10-3 작업 이름 설정, 작업 실행 시기 설정

  4. 시작 시간은 오전 1:0 (새벽 1시, 시간은 각자 상황에 맞게 설정합니다.), 작업 실행은 매일(A), 시작날짜는 기본 설정 그대로 사용합니다.


    그림 10-4 작업을 시작할 시간과 날짜 선택

  5. 작업을 실행할 사용자의 암호를 입력합니다.


    그림 10-5 작업을 실행할 사용자 및 암호 입력

  6. [마침]을 클릭하면 이 작업의 고급 속성 열기(A)를 체크하고 마침을 누릅니다.


    그림 10-6 작업 예약 완료

  7. 실행(R) 부분의 맨 마지막에 c:\tools\trac-backup.ps1을 추가합니다.


    그림 10-7 trac-backup.ps1 설정

운영 중인 Subversion 저장소를 안전하게 백업하기

Apache에서 Subversion이 작동 중일 때에도 안전하게 저장소를 백업할 수 있도록 해주는 명령이 바로 svnadmin hotcopy 명령입니다. hotcopy 명령은 아래와 같이 사용합니다. 같은 컴퓨터상의 다른 하드디스크로도 복사할 수 있습니다.

svnadmin.exe hotcopy C:\Repos\example D:\backup\Repos\example

아래 백업 스크립트를 사용하면 편리하게 백업할 수 있습니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/PowerShell/svn-backup.ps1
  • 부록 CD 경로 : Scripts/PowerShell/

svn-backup.ps1

$backup_dir = "C:\Backup"
$repos_dir = "C:\Repos"

new-item -path $backup_dir -type directory -force
new-item -path $backup_dir\Repos -type directory -force

$today = (Get-Date).tostring('yyyyMMdd')+"."+(Get-date -uformat %j)

new-item -path $backup_dir\Repos\$today -type directory -force

foreach ($item in get-childitem $repos_dir)
{
	if (test-path "$repos_dir\$item" -pathtype container)
	{
		svnadmin hotcopy $repos_dir\$item $backup_dir\Repos\$today\$item
	}
}

copy $repos_dir\htpasswd $backup_dir\Repos\$today
copy $repos_dir\authz $backup_dir\Repos\$today

[int] $delete_day = (Get-Date -uformat %j) -30
Remove-Item $backup_dir\Repos\*.$delete_day -recurse -force

이 스크립트를 C:\tools 디렉터리로 복사한 다음, $backup_dir 부분을 각자 상황에 맞게 수정합니다. 이 스크립트는 백업 디렉터리 아래에 20071216.350(년월일.줄리안 데이트) 형식으로 디렉터리를 만들고 그 아래에 svnadmin hotcopy 명령으로 각 저장소를 복사합니다. 그리고 사용자 계정과 접근 권한을 저장하고 있는 htpasswd 파일과 authz 파일도 복사합니다. 매일 매일 백업을 하면 백업 데이터가 무한정 늘어날 수 있기 때문에 30일이 지난 백업본은 삭제합니다. [int] $delete_day = (Get-Date -uformat %j) -30 부분에서 30이 날짜입니다. 이 부분도 각자 상황에 맞게 수정합니다.

이 스크립트는 사람이 직접 실행하는 것이 아닌 윈도우의 예약된 작업을 통해서 하루에 한번씩 실행되도록 설정하면 됩니다. 예약된 작업을 설정하는 것은 trac-backup.ps1과 동일합니다. 작업 이름은 svn backup, 시작 시간은 오전 1:00, 실행 부분은 c:\tools\svn-backup.ps1로 지정해주면 됩니다.

원격지의 Subversion 저장소 백업하기

Subversion 1.4 부터 svnsync라는 명령이 추가되었습니다. 이 명령은 원격지의 Subversion 저장소를 그대로 가져오는 명령입니다. 처음 실행을 하면 저장소의 모든 내용을 가져오고, 그 다음 실행할 때 부터는 증가된 리비전만 가져옵니다. 그래서 시간을 절약할 수 있는 장점이 있습니다.

svnsync 명령을 이용하려면 먼저 빈 저장소를 만들어야 합니다. 백업 디렉터리는 C:\Backup이라고 가정합니다.

svnadmin create C:\Backup\example

여기서 중요한 것은 C:\Backup\example\hooks에 pre-revprop-change.cmd라는 빈 파일을 만들어주어야 합니다. 빈 파일을 만드는 것은 새로 만들기(W) → 텍스트 문서로 만들면 됩니다. 이 빈 파일이 있어야 svnsync 명령을 사용할 수 있습니다.


그림 10-8 빈 파일 생성 방법

저장소를 초기화 합니다. file:///c:/Backup/example은 방금 만든 저장소이며, http://192.168.1.100/svn/example는 가져올 저장소의 URL입니다.

svnsync init file:///c:/Backup/example http://192.168.1.100/svn/example


그림 10-9 저장소 초기화

이제 원격에 있는 저장소를 가져옵니다. 처음 실행하면 리비전 1부터 가져오며, 그 이후부터는 증가된 리비전을 가져오게 됩니다.

svnsync sync file:///c:/Backup/example


그림 10-10 저장소 동기화

원격 Subversion 서버에 프로젝트가 추가될 때마다, 백업을 하는 쪽도 그에 맞춰서 추가된 프로젝트 이름과 똑같은 저장소를 만든 뒤, pre-revprop-change.cmd 빈 파일을 만들어주고, svnsync init 명령으로 초기화 해주어야 합니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/PowerShell/svn-sync.ps1
  • 부록 CD 경로 : Scripts/PowerShell/

svn-sync.ps1

$backup_dir = "C:\Backup"
$url = "file:///" + $backup_dir.Replace("\","/")

new-item -path $backup_dir -type directory -force

foreach ($item in get-childitem $backup_dir)
{
	if (test-path "$backup_dir\$item" -pathtype container)
	{
		svnsync sync $url/$item
	}
}

이 스크립트는 윈도우의 예약된 작업에 설정하여 사용하면 됩니다. C:\Backup 아래에 있는 모든 저장소에 대해 svnsync sync 명령을 실행합니다. 원격지 서버에 새로 추가된 프로젝트는 이 스크립트로는 가져오지 못하므로, 꼭 추가된 프로젝트에 해당하는 저장소를 만들어주어야 합니다.

이로써 통합 개발 환경 구축이 끝났습니다. 실제 활용 방법은 “통합 개발 환경의 실제 활용”에서 설명하도록 하겠습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.