사용자 도구

사이트 도구


kb:perforcebackup

Perforce Backup

퍼포스 백업에 관해 기술한다.

개념

백업해야 할 내용들의 목록은 다음과 같다.

  • versioned files
    • 사용자가 추가한 일반적인 파일들
    • 각 버전별로 존재
  • checkpoint
    • 퍼포스 데이터베이스 파일 백업
    • 사용자가 올린 파일들의 목록, 체인지리스트 목록, 라벨, 잡 등등
    • 자동으로 생성되지 않으며, 특정 퍼포스 명령(p4d -jc)을 통해서만 생성된다.
  • journal
    • 마지막 체크 포인트 파일 생성 시점 이후로 퍼포스 저장소에 가해진 변경에 대한 기록

즉 체크포인트 파일과 저널 파일은 일종의 메타 데이터이며, SqlServer 차등/로그 백업에서의 그것과 같다고 볼 수 있다.

백업 절차

아래와 같은 절차를 거쳐야 한다.

  1. 데이터 검증
    • p4 verify -q //...
  2. 퍼포스 서비스 중지
    • net stop Perforce
  3. checkpoint 생성 및 journal 비움
    • p4d -jc
    • 위 명령의 에러 코드를 검사해서 제대로 백업이 되었는지 검사하게는 게 좋다고 한다.
    • 온라인으로 핫백업할 수 있는 모양이긴 한데…?
  4. versioned files 저장
    • 적당히 압축하던지, 복사하던지 한다.
  5. checkpoint & journal & versioned files 이동
    • 적당히 이동
    • checkpoint.xxx.md5 파일을 빼먹지 말자.
    • 사실 checkpoint 파일이 정상적으로 잘 생성되었다면, journal 파일은 필요없긴 하다.
  6. 퍼포스 서비스 재시작
    • net start Perforce

복구 절차

하드가 통채로 날아갔다고 간주한다.

  1. 퍼포스 재설치
  2. 퍼포스 서비스 중지
    • net stop Perforce
  3. 퍼포스 루트의 모든 db.* 파일들 다른 디렉토리로 이동
    • move C:\Program Files\Perforce\Server\db.* C:\Program Files\Perforce\Server\Temp\
  4. 데이터베이스 복구
    • p4d -r $P4ROOT -jr checkpoint_file
  5. 버전 파일 복구
    • 원래 있던 곳에다 복사

백업 예제

@ECHO OFF
@TITLE Backing up perforce repository
 
FOR /F "tokens=1-3 delims=- " %%I IN ('date /t') DO SET DATE=%%I.%%J.%%K
 
SET PERFORCE_ROOT="C:\Program Files\Perforce\Server"
SET BACKUP_ROOT="D:\Backup\%DATE%"
SET BACKUP_FILE="D:\Backup\%DATE%\files.rar"
 
mkdir %BACKUP_ROOT%
 
p4 verify -q //... > %BACKUP_ROOT%\Backup.log
 
net stop Perforce
 
%PERFORCE_ROOT%\p4d -jc -r %PERFORCE_ROOT%
 
"C:\Program Files\WinRAR\rar" a -r -m5 %BACKUP_FILE% %PERFORCE_ROOT%\depot
 
for /F "delims=" %%I in ('"dir /B /S %PERFORCE_ROOT% | findstr /E "journal\.[0-9]""') do (
    echo moving %%I to %BACKUP_ROOT%
    move /Y "%%I" %BACKUP_ROOT%
)
 
for /F "delims=" %%I in ('"dir /B /S %PERFORCE_ROOT% | findstr /E "checkpoint\..*""') do (
    echo moving %%I to %BACKUP_ROOT%
    move /Y "%%I" %BACKUP_ROOT%
)
 
net start Perforce

실제로 돌려본게 아니라, 걍 타이핑한 거라 오타가 있을 수도? 아래의 파이썬 스크립트는 위에서 생성한 백업 파일들을 최근 일주일치만 보관하기 위한 스크립트이다.

import datetime
import os
import shutil
import errno
import stat
 
def handle_remove_read_only(func, path, exc):
    exc_value = exc[1]
    if func in (os.rmdir, os.remove) and exc_value.errno == errno.EACCES:
        os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
        func(path)
    else:
        raise
 
def remove_obsolete(root):
    if root[-1] != os.sep:
        root += os.sep
 
    with open("remove_obsolete.log", "w") as output:
        preserved = []
 
        today = datetime.date.today()
 
        output.write("-- %(y)04d.%(m)02d.%(d)02d" % { 'y': today.year, 'm': today.month, 'd': today.day })
 
        for i in range(0,7):
            target = today + datetime.timedelta(days=-i)
            preserved.append("%(y)04d.%(m)02d.%(d)02d" % { 'y': target.year, 'm': target.month, 'd': target.day })
 
        for name in os.listdir(root):
            full_name = root + name
            if os.path.isdir(full_name):
                if not (name in preserved):
                    output.write("deleting " + full_name + "\n")
                    shutil.rmtree(full_name, False, handle_remove_read_only)
 
if __name__ == "__main__":
    remove_obsolete("D:\Backup")  

링크

kb/perforcebackup.txt · 마지막으로 수정됨: 2014/11/11 14:53 저자 excel96