SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 26510|回复: 52

[推荐] SVN自动全备份及增量备份脚本,包含文件压缩,可加入window 任务

  [复制链接]
发表于 2008-12-23 14:21:38 | 显示全部楼层 |阅读模式
一直用这套脚本备份,脚本主体虽不是原创,但是从网上得到后因为不能运行也进行了些修改,前两天看到有人问关于SVN备份的问题,今天又把脚本整理了一下,解决了不能循环备份多个配置库的问题。希望对大家有所帮助。在此也谢谢提供脚本主体的高人。
9 L4 U( c9 O' y7 d- F- z2 m7 Z我的备份策略是一个月一次全备份,一周一次增量备份,并且每天也进行增量备份,在Window任务里设置定时进行,设置好后就不用管了,再加一层保险就是定期把备份文件移到另外一台机器存储。# c+ o' p9 g0 m1 W, K7 {  {
(一)全备份,包含两个文件hotcopy.bat和最终执行文件fullbackup.bat
: ~- s6 Y# o2 n2 U# Q. }1) hotcopy.bat
+ C# O7 G3 E" R( W2 M6 l+ m+ ^@echo 正在备份版本库%1……9 a7 i; u' e; m' i* y- R7 K, n
rem @%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2
7 ^% m/ |: \1 c5 \@%SVN_HOME%\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2
$ P& R4 n! W! h@echo 版本库%1成功备份到了%2!
- ?1 E, L: @( c$ s0 n! @0 ]9 V/ ~1 `" G8 x

. {1 K! J+ a) S; a! F2)fullbackup.bat
9 t- P# O9 E, m. \/ aecho off! }0 l* }' |) k) u/ t
rem Subversion的安装目录
$ z3 J' e5 ?7 Z$ M# x. o- qrem set SVN_HOME="F:\Program Files\Subversion". [- `1 z) ?1 b& m
set SVN_HOME="F:\Program Files\CollabNet Subversion Server"
' U- N/ @; {* z" {/ I0 G" Brem 所有版本库的父目录1 g; t6 `2 o7 Y& \) z
set SVN_ROOT=G:\SVN6 A# H- r! M% \
rem 备份的目录
$ f2 R1 z' z5 L6 L+ Nset BACKUP_SVN_ROOT=h:\svnrootbak
/ X; Z* b; r+ `# J4 f( u7 s) lset BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%" i  _  |9 f( i

/ n, ]& ^4 c9 ]" y( ~" `1 hif exist %BACKUP_DIRECTORY% goto checkBack
3 Q- r; ^# L) P" X& x2 E+ g% C' Iecho 建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/fullbackup.log
" [3 H. {; U6 u9 ]& |1 F( N, Gmkdir %BACKUP_DIRECTORY%
3 C& u7 Q* j) K+ frem 验证目录是否为版本库,如果是则取出名称备份& @0 p$ m: N, K* ^) ^# S1 h+ r8 Z
for /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" hotcopy.bat "%%~fI" %%~nI0 S: n2 A/ N* y/ z' _2 t% K
goto end
: Q1 B. ]! C% l8 b$ h( ]:checkBack$ e! K* h' G1 H1 Z, b/ V
echo 备份目录%BACKUP_DIRECTORY%已经存在,请清空。
) Z% y. t9 T5 D- dgoto end
& a6 v. c% y* G( J:end5 E5 i: t7 V( k& w
, e$ `$ x" V$ C  f
1 ]! v5 e) D* I
(二)增量备份,包含三个文件,dump.bat、最终执行文件svndump.bat和配置库名称配置projectlist.conf  E$ w8 q  }' O) h% l
1)dump.bat
6 L$ }4 ?# J- y! F# r@ECHO OFF5 I- [( Q' ^# b& ?9 e7 x+ N, B, P5 s
rem 调用格式:dump 项目库名1 J2 E  g( G2 }$ e$ u
if "%1"=="" goto no_args
+ d7 `: H. a1 V! ~) ?' Y) F1 a, |! jset PROJECT=%1
& B0 {, p1 ]- oif not exist %RAR_STORE%\%PROJECT% mkdir %RAR_STORE%\%PROJECT%0 T+ Z9 P5 z. M( @8 |
cd %RAR_STORE%\%PROJECT%
* T) }! _7 \# H& ~- ISET LOWER=0
% A: I6 |! ?+ ]! W+ @. `, a1 tSET UPPER=0
1 X8 [4 i9 l, y) o% l3 r  g6 Z* n: Z1 ~" E: s, C) o4 _0 {3 c
@echo 项目库%PROJECT%2...>> %Log_PATH%\%PROJECT%_log.txt7 Z" I5 h" Z+ W: t- Z" m
%SVN_LOOK% youngest %SVN_REPOROOT%\%PROJECT%> %Log_PATH%\A.TMP2 W+ f% B  t3 d& D! B& f+ T: f" _
@echo 项目库%PROJECT%3...>> %Log_PATH%\%PROJECT%_log.txt' @$ \, v6 a+ ~+ c( ~
@FOR /f %%D IN (%Log_PATH%\A.TMP) DO set UPPER=%%D
2 j- k1 r+ o" y- J$ P& z# Zif %UPPER%==0 GOTO :N_EXIT7 b8 k; }2 }% e
if not exist %Log_PATH%\%PROJECT%_last_revision.txt GOTO :BAKUP+ Q& M6 B# }$ `4 ?- K: I  k- O
rem 取出上次备份后的版本号,并做+1处理(注意此算法未在98系统验证)
' U3 v- M7 ?4 k/ E@FOR /f %%C IN (%Log_PATH%\%PROJECT%_last_revision.txt) DO @set LOWER=%%C1 T  p9 l$ V2 W/ z" ^7 T5 R) ~0 }
@set /A LOWER=%LOWER%+1
# C1 \( _+ K- n- h/ @0 z7 }- G+ Irem 不需要备份,则跳转结束8 t) ~& g4 b% V" t7 |3 D: _& J" u4 i
IF %LOWER% gtr %UPPER% GOTO :N_EXIT
2 K8 A& ^$ x- u8 ?! _3 K, q) D" Z" {5 }$ U+ F' ?) ?, v* t
:BAKUP
6 C5 c; W7 c3 d( ?SET FILENAME=%PROJECT%_%LOWER%_%UPPER%
$ B) T- \+ H7 a$ n9 f9 Z8 J@ECHO 开始备份项目库:%PROJECT%,生成文件=%FILENAME%7 a) V5 u# ^+ ?3 }7 {" B7 n
%SVN_ADMIN% dump %SVN_REPOROOT%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp( b8 k; Q/ v8 K
rem %RAR_CMD% a -df %PROJECT%_%UPPER%.rar %
3 Q% Z6 h7 D1 @0 R8 X" Urem 准备写备份日志信息
4 a; h. ^% g9 y0 a/ S+ `IF %LOWER% gtr 0 GOTO :WRITENOTE
2 e* e  s$ I1 f9 J& C3 P/ s@ECHO ------2-----%date% >> %Log_PATH%\%PROJECT%_log.txt
4 n: x& ]# V" e. ?7 }@echo  -- 3-------添加备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt
9 Q, d7 S/ d7 o% v2 K) GGOTO :COMPLETE* c. C2 n' u2 A& j

) h* g3 N1 L4 N:WRITENOTE. M0 J' H7 O/ J' a8 K. q
@ECHO %date% >> %Log_PATH%\%PROJECT%_log.txt
' E, R+ a* B. H9 c@echo  -- 4------添加增量备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt
" e9 C% z7 w5 R; Y6 V+ B* Y+ }. G% i& y  F
:COMPLETE
- `6 [8 F# f" I; P% X- P8 Frem 下面一行用于拷贝备份文件到映射的驱动器上
, ?4 V3 N6 b! d: \+ Krem copy %PROJECT%.rar %RAR_STORE%\%PROJECT%\
+ b2 t' \0 I, B4 H  }  Emove %FILENAME%.dmp %RAR_STORE%\%PROJECT%\  h2 D% O0 T  d9 x. b
del %Log_PATH%\A.TMP/ F0 n+ \; a1 @. W
@echo %UPPER% > %Log_PATH%\%PROJECT%_last_revision.txt
) J& R7 I7 o. q& q0 ]* P, L, p+ n0 t+ w2 S  p
:N_EXIT
; H3 u' d3 N6 {) b@echo 项目库%PROJECT%处理结束...>> %Log_PATH%\%PROJECT%_log.txt
6 v7 V) o  ]& l6 ^+ X@CD..% _9 c' _, ~5 G  J) Y4 K
@exit /B7 [, y. H7 X0 d' G" [
:no_args5 E1 J0 c: M9 L' _$ Q
@ECHO ON
- V* ^+ {" B4 d/ N@echo "正确调用方法: dump 项目库名"
+ R, G8 S3 f" |* e) |8 C. P$ J. W$ D$ |2 Q3 X
( |) O% J3 \  K" B
2)svndump.bat   z  P& ~7 ^  X) n6 C+ n. s! z
echo off0 z. P+ o8 Z: }# H+ E7 a' |
rem Subversion的安装目录及执行文件7 y; m$ @3 P  Z+ u. b
set SVN_HOME="F:\Program Files\CollabNet Subversion Server"
; B9 ^* B9 K* A  z5 s  ^set SVN_ADMIN=%SVN_HOME%\svnadmin.exe
& L1 N. H' |$ K* ~+ T- B% K  E0 ?set SVN_LOOK=%SVN_HOME%\svnlook.exe& E/ K1 p( ?! j! J5 d
rem 配置库仓库根目录
+ f( _6 a, A$ X1 Kset SVN_REPOROOT=G:\SVN3 c5 G( O3 U* E) f
rem 压缩命令4 \8 b. j7 }* o- B8 V. t  k, m; ~
set RAR_CMD="E:\Progra~1\WinRAR\WinRAR"
6 n; i; U6 t$ I- ^/ arem 增量备份文件存放路径
8 E# Z3 b( X0 D  c. }8 Oset RAR_STORE="H:\svnincrementW"9 r* o! ]3 x  C+ m# H: T
rem 日志及最后一次备份修订号存放文件目录,以下是跟增量备份脚本目录同一目录5 K, T1 y6 q3 i8 a2 r. o
set Log_PATH=G:\backup\incrementW
0 p9 U4 w1 H, Q& y
/ o0 Z8 P- Q6 r0 f% s9 @4 e@echo 项目库%PROJECT%处理1...>> %Log_PATH%\%PROJECT%_log.txt( G) e: H9 O9 M: B9 g* w
rem 读取项目库列表文件,并忽略其中;开头的行
- O. q' y  C, ~' F9 t; v* E5 @6 T  IFOR /f "eol=;" %%C IN (projectlist.conf) DO  call G:\backup\incrementW\dump.bat %%C
1 L' o8 A8 {! @' D  g, e* l
7 V# @- R4 O5 P+ [( A' q  b/ j' J+ o6 S
3)projectlist.conf6 j8 M8 R  `/ X8 H
;**************************************************8 z' x6 N3 S# @. l  v
;01. project1开发库' _9 s' Z+ M' n' p$ X$ G' a
;    更新频率: 高; o4 U3 d8 f0 f1 o, |
;**************************************************9 J" w, p+ A; a1 E' w/ l7 h
PROJECT14 N- i: \: ?; q* h
;**************************************************
" ]7 [: u9 ]# c) h;02. 此处可写注释信息
" I3 N$ d9 O, ?6 q;**************************************************' }; [2 r3 m- [; N5 D! G
PROJECT2: A3 z) m: C7 k, {7 W
PROJECT3
# N& }. w' m; @" E' ~. q" _PROJECT4. o+ q, H8 R6 U3 C: N
PROJECT5
( d6 `" {; z" ]' W' p& D
, C0 t) X4 ^7 O$ p- I' r& g+ B[ 本帖最后由 千寻 于 2008-12-23 14:26 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 2金钱 +5 收起 理由
ydyin + 1 赞一个!
CMStruggling + 4 感谢分享!!!

查看全部评分

本帖被以下淘专辑推荐:

  • · SVN|主题: 3, 订阅: 0
发表于 2008-12-23 15:48:51 | 显示全部楼层

回复 楼主 的帖子

感谢千寻千大人分享关于SVN自动备份的脚本;! P* A6 A1 i) z, ~
大家的福音啊!!!
回复 支持 反对

使用道具 举报

发表于 2008-12-24 11:18:08 | 显示全部楼层
感谢版主分享~
, r$ w: H# w4 x. A2 y呵呵3 ]+ y" Y7 Y; U: b  F) f6 s6 V1 `2 U
分享 互助 共进~
回复 支持 反对

使用道具 举报

发表于 2008-12-24 12:41:43 | 显示全部楼层

有没有分段备份的!

现在的数据库比较大,主要是项目有一些库文件有1G大小。整个项目大小在2.5G,所以在现在只有1000个版本是备份大小已经超过了5G,速度很慢。是否可以分段备份一些,这样以后只备份后续的部分即可?
回复 支持 反对

使用道具 举报

发表于 2008-12-24 13:09:51 | 显示全部楼层
可以选择备份一部分4 B4 W+ m5 ]5 E4 K/ S
部分版本即可
回复 支持 反对

使用道具 举报

发表于 2008-12-25 14:20:02 | 显示全部楼层
谢谢分享,我习惯把备份写成windows服务,来代替计划任务
回复 支持 反对

使用道具 举报

发表于 2009-2-19 17:13:28 | 显示全部楼层
全力支持!!!喜欢!
回复 支持 反对

使用道具 举报

发表于 2009-8-17 22:34:20 | 显示全部楼层
楼主厉害 谢谢啊
回复 支持 反对

使用道具 举报

发表于 2009-8-18 11:00:49 | 显示全部楼层

回复 楼主 的帖子

看了你的脚本,才知道有磁带机和专门的备份工程师是多么幸福的一件事。
回复 支持 反对

使用道具 举报

发表于 2010-2-23 16:40:23 | 显示全部楼层
LZ,你这个增量备份的脚本如何使用 ? 能给个说明吗?5 Z' ^# u" {( p; l$ c; Z" h
还有完全备份的脚本,我用了,目标备份目录如果不是空的话,执行脚本会报错,并不会去删除....
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

QQ|小黑屋|手机版|无图版|SCMLife.com ( 京ICP备06056490号-1 )

GMT+8, 2018-6-24 15:23 , Processed in 0.081431 second(s), 8 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

快速回复 返回顶部 返回列表