svn 증분 백업

프로그래밍 : 2008/11/02 14:01
기존에 svn저장소를 gmail로 백업을 구성 했을 때는 저장소를 항상 전체 백업을 하도록 했었다.
아직은 저장소가 크지 않아서 큰 문제는 없지만 백업후 압축을 하는데 너무 많은 시간이 걸려서 증분백업을 하도록 구성 했다.

일단 증분백업은 하루단위로 백업을 수행하고, 전체 백업은 일주일에 한번만 백업하도록 구성했다.

증분백업을 하기 위해서는 백업을 한 리비전 정보를 저장해 놓아야지만 다음 백업시 이를 이용하여 추가된 리비전만 백업이 가능하다.

그런 일을 해주는 것에 svnlook이라는 것이 있다. 이를 이용하면 인자로 주어지는 저장소의 최근 리비전을 출력해준다. 이 리비전을 이용하여 저장소 덤프시 전에까지 저장한 리비전과 svnlook이 리턴한 리비전까지 백업을 수행해주면 된다.

아래는 이를 이용한 쉘스크립트이다.

#!/bin/sh

svnrepos="/var/svn/chadr"
lastrevfile="svnbackup_lasttrev"
date="$(date +%y%m%d)"
lastrev=`svnlook youngest ${svnrepos}`
prevrev=`cat ${lastrevfile}`
nextrev=`expr ${prevrev} + 1`
md5sumfile="svnbackup_inc.md5"
backupdir="tmp_svnbackup_inc"
emailaddr="chadr@a.com"
adminemailaddr="chadr@a.com"
dumpfile="dumpfile_${nextrev}_${lastrev}.${date}"

if [ $nextrev -gt $lastrev ]
then
  mutt -F .mutt-local -s svnbackup_skipped_inc_norev_${date} ${adminemailaddr} < svn_muttbody
  echo "dose not exist more revision to backup."
  exit
fi

echo "next revision : ${nextrev}"
echo "last revision : ${lastrev}"

mkdir ${backupdir}

echo "dumping svn repositary..."
svnadmin dump --incremental --revision ${nextrev}:${lastrev} ${svnrepos} > ${dumpfile}
echo "dump completed."

touch ${md5sumfile}

oldMD5=`cat ${md5sumfile}`
newMD5=`md5sum ${dumpfile}`
newMD5=${newMD5:0:32}

echo "oldMD5 : ${oldMD5}"
echo "newMD5 : ${newMD5}"

if [ $oldMD5 = $newMD5 ]
then
  mutt -F .mutt-local -s svnbackup_skipped_inc_${date} ${adminemailaddr} < svn_muttbody
  echo "already backuped revision... exit."
else
  echo "compressing..."
  7za a -mx9 -mmt -v9m ${backupdir}/[dev.dalmuri.net.var.svn.chadr]${dumpfile}_inc_${nextrev}_${lastrev}.7z ${dumpfile}

  cd ${backupdir}

  echo ""
  echo "file list of sending."

  count=0

  for file in $(ls)
  do
    echo "${file}"
    count=`expr $count + 1`
  done

  echo ""

  i=1
  #send email
  for file in $(ls)
  do
    echo "sending to ${emailaddr}...(${i}/${count}) ${file}"
    mutt -F ../.mutt-local -a ${file} -s svnbackup_inc_${nextrev}_${lastrev}_${date}_[${i}/${count}] ${emailaddr} < ../svn_muttbody
    echo "sending completed. ${file}"
    i=`expr $i + 1`
  done

  mutt -F ../.mutt-local -s svnbackuped_inc_${nextrev}_${lastrev}_${date} ${adminemailaddr} < ../svn_muttbody

  echo "all sending completed."

  cd ..

  echo "${newMD5}" > ${md5sumfile}
  echo "${lastrev}" > ${lastrevfile}

fi
#delete tmp dir
rm -rf ${backupdir}
rm ${dumpfile}

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/11/02 14:01 2008/11/02 14:01

트랙백 주소 :: http://dcple.com/blog/trackback/538

댓글을 달아 주세요

  1. perl로 만들어놓은 것도 있는데...
    나도 증분 백업으로 cron 돌려놓으려다가...

    그냥 mirror disk 믿고, 한달에 한번만 백업하는 중 -_-;

[로그인][오픈아이디란?]