svn版本库的备份,也是对代码的一种备份策略

1.Svn 自带备份工具刀简介

第一种svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。

缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。

个人建议在版本数比较小的情况下使用这种备份方式。

第二种svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;

优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。

缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。

第三种svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。

优点是:当制作成2个镜像库的时候起到双机实时备份的作用;

缺点是:当作为2个镜像库使用时,没办法做到“想完全抛弃今天的修改恢复到昨晚的样子”;而当作为普通备份机制每日备份时,操作又较前2种方法麻烦。

考虑到备份的易操作性,和快速恢复。建议采用dump,hotcopy.

2.svn 备份命令


svn备份常用命令

2.1、完全备份和增量备份svn

svnadmin  dump  /svn/project/www     > full.svn.bak        #完全备份/svn/project/www这个版本库,并另存为full.svn.bak

svnadmin  dump  /svn/project/www  -r 8 --incremental    > svn.bak.1       #以增量把版本库8转存到svn.bak.1


参数介绍:

-r [--revision] :指定版本ARG(或X:Y范围)

--incremental   :以增量方式进行转存

--deltas        :在转存输出中使用差异

-q [--quiet]    :在标准错误输出不显示进度(仅错误)


2.2dump备份还原。

svnadmin  create  /svn/project/test   #创建一个新的版本库

svnadmin  load    /svn/project/test     < full.svn.bak      #现还原完全备份

svnadmin  load    /svn/project/test     <   svn.bak.1        #再还原增量备份的内容


2.3svnadminhotcopy  /svn/project/www     /root/backup.svn.www/         #热拷贝www这个版本库

,可以直接拿来用

3.下面以hotcopy 备份恢复以test 库位原型进行说明(脚本可以一次执行,备份多个制定的库)

3.1备份策略

hotcopy 进行定时热全备份,在速度和效率占优势,这里定时晚上的10

备份的库,进行压缩处理

保证十天的备份,超过十天的备份删除(可以在脚本中修改)

备份用计划任务执行

3.2脚本说明

filelist.txt

svnbackmore.sh

svnback.sh

其中filelist.txt svnbackmore.sh 是可以同时备份多个版本库

Svnback.sh  是备份单个版本库

#!/bin/bash

#writer loy

#date 20130717

#函数体中$1版本存放位置(版本库上一级目录),$2版本库名字,$3备份目录(备份版本库上一级目录)

#filelist 是版本库名字的列表

backsvn()  #备份的函数

{

local daten=$(date  +%Y%m%d)

local dir1=$3/$2


 if [ -d $dir1 ];then

 mkdir  $dir1/$2.$daten

 else

 mkdir -p  $dir1/$2.$daten

 fi


 cd $dir1

 svnadmin hotcopy $1/$2   $dir1/$2.$daten

 tar zcvf$2.$daten.tar.gz  $2.$daten

 rm -rf $2.$daten


}


deloldsvn()    #删除old 的备份

{

 local date10=$(date  -d '10 days ago' +%Y%m%d)

 local dir1=$3/$2

 cd $dir1

 ls |grep $date10|xargs rm-rf

}

#backsvn '/usr/local/svn' 'test' '/usr/svnback'


while read line    #读取版本库的列表进行逐个备份和相应的删除

do

backsvn $1 $line $3

deloldsvn $1 $line $3

done < "/usr/src/svncode/filelist.txt"

3.3 写计划任务

crontab –e

  * 22 * * * ./usr/src/svncode/svnbackmore.sh  '/usr/local/svn' '000' '/usr/svnback' >/dev/null 2>&1 &

:wq

保存退出

3.4 备份脚本的使用

  ./svnback.sh '/usr/local/svn' 'test''/usr/svnback'  #位置参数传递给脚本

  ./svnback.sh   '/usr/local/svn' '000' '/usr/svnback'  注意第二个位置参数‘000’是为了配合程序的运行,因为真正的版本库会从filelist 中读取


4.恢复的操作


恢复的时候,需要先把原来的库,mv 改后缀比如 mv www  www.bak

  mkdir www


备份解压的版本库     svnserver 版本库目录

svnadminhotcopy  /root/backup.svn.www   /svn/project/www

  chown apache.apache -R  www (把属主和属组都改成apache 配置文件中的用户)

一切完毕在客户端进行测试。