SVN备份与还原

备份:
一个较大的Subsersion版本库想用最少的空间来将它备份下来,用这个命令(请将/repo替换成你的版本库路径)
svnadmin dump --deltas /svn/date/www |bzip2 |tee dump.bz2 | md5sum >dump.md5
最重要的一步是 -deltas,将消耗更多的CPU资源,但拥有更有效的差异存储办法。
bzip2压缩方案比gzip慢,但换来的更好的压缩率。
更有趣的是,tee方法将压缩的数据流转向到文件dump.bz2,同时将其输出到标准输出,后者有转向给了MD5摘要计算工具。

恢复:
首先创建资源库
svnadmin create /svn/date/www

bzcat dump.bz2 | svnadmin load /svn/date/www

1、首先对仓库进行一次全备份

svnadmin dump --deltas /svn/date/www |bzip2 |tee dump.bz2

对版本1进行了一次全备份,然后执行增量备份的脚本,脚本如下:

#!/bin/bash
#Backup svn
# Description: 这是svn增量备份的脚本,在全备的基础上每天进行增量备份。同时保证数据的安全性,
#              每个月的最后一天执行一次所有增量的全备份。
# Release:
#       1.0

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

DATE=`date +%Y%m%d`
BK_DIR="/data1/svn_backup"
SVN_DIR="/data2/svn/repodata"

if [ ! -d $BK_DIR/$(date -d "yesterday" +"%Y%m") ]
then
/bin/mkdir -p $BK_DIR/$(date -d "yesterday" +"%Y%m")
fi

for i in project project2 project3 enterprise

do

svnlook youngest /data2/svn/repodata/$i >> /tmp/$i.log
#第一次全备之后的版本号


head_REV=`head -1 /tmp/$i.log`
#用于每月增量备份最开始的版本号记录位置


old_REV=$[${head_REV}+1]
#上次增量备份的版本号


last_REV=`tac /tmp/$i.log|sed -ne 2p`
#这次增量备份的起始版本号


start_REV=$[${last_REV}+1]
#这次增量备份的结束版本号


end_REV=`tac /tmp/$i.log|head -1`
#截取每月的最后一天
DAY=`cal |grep -v '^$'|tail -1 |awk '{print $NF}'`

NOW_DAY=`date +%d`

while [ ${last_REV} -lt ${end_REV} ];
do

svnadmin dump $SVN_DIR/$i -r ${start_REV}:${end_REV} --incremental >> $BK_DIR/$(date -d "yesterday" +"%Y%m")/${DATE}_$i

break
done

if [ ${NOW_DAY} -eq $DAY -a ${head_REV} -lt ${end_REV} ];then

svnadmin dump ${SVN_DIR}/$i -r ${old_REV}:${end_REV} --incremental > ${BK_DIR}/${DATE}_$i_month

fi

echo
done
#自动删除一个月前的备份文件

svnadmin dump $SVN_DIR/$i -r ${start_REV}:${end_REV} --incremental > $BK_DIR/$(date -d "yesterday" +"%Y%m")/${DATE}_$i

--如果不用追加的话,那么该增量备份脚本,一天只能运行一次,否则会造成数据丢失,只会还原最后一次运行的增量结果


【新增版本,在执行脚本】

新增一个版本,执行一次脚本;新增2个版本,执行一次脚本


[root@localhost test]# sh 1.sh
* Dumped revision 2.
[root@localhost test]# sh 1.sh
* Dumped revision 3.
* Dumped revision 4.


【然后模拟数据丢失等物理故障】

[root@localhost test]# rm -fr /svn/date/www/                
[root@localhost test]# svnadmin create /svn/date/www        
[root@localhost test]# chown -R apache.apache /svn/date/www/


【还原】:先利用全备份还原,然后再用增量备份还原

[root@localhost date]# bzcat dump.bz2 |svnadmin load www/
<<< Started new transaction, based on original revision 1
    * adding path : httpd-2.2.11.tar.gz ... done.

------- Committed revision 1 >>>

全备份还原到版本1


[root@localhost 201305]# svnadmin load /svn/date/www/ < 20130524_www
<<< Started new transaction, based on original revision 2
    * adding path : CRiSP.key ... done.
    * adding path : VShell.key ... done.
    * adding path : doorway.key ... done.
    * adding path : vt100.key ... done.
    * adding path : vt220-linux.key ... done.
    * adding path : vt220.key ... done.
    * adding path : vt400.key ... done.
    * adding path : wyse50.key ... done.

------- Committed revision 2 >>>

<<< Started new transaction, based on original revision 3
    * deleting path : httpd-2.2.11.tar.gz ... done.

------- Committed revision 3 >>>

<<< Started new transaction, based on original revision 4
    * editing path : wyse50.key ... done.
    * adding path : wyse50.key.bak ... done.

------- Committed revision 4 >>>

增量备份还原到版本4


然后再添加到计划任务中,定时备份


当然了,还可以对每一个版本的更新做增量备份,还原的思路,基本不变,都是先从低版本逐个恢复到高版本

即,先恢复最近的一次完整备份 weekly_full_backup.071201(举例),然后恢复紧挨着这个文件的增量备份 daily_incremental_backup.071202,再恢复后一天的备份071203,依次类推


还可以参考以下文章

http://cyr520.blog.51cto.com/714067/940089


你可能感兴趣的:(svn还原)