SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 27952|回复: 52

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

  [复制链接]
发表于 2008-12-23 14:21:38 | 显示全部楼层 |阅读模式
一直用这套脚本备份,脚本主体虽不是原创,但是从网上得到后因为不能运行也进行了些修改,前两天看到有人问关于SVN备份的问题,今天又把脚本整理了一下,解决了不能循环备份多个配置库的问题。希望对大家有所帮助。在此也谢谢提供脚本主体的高人。
% r/ I% c* _8 ^# Q/ V我的备份策略是一个月一次全备份,一周一次增量备份,并且每天也进行增量备份,在Window任务里设置定时进行,设置好后就不用管了,再加一层保险就是定期把备份文件移到另外一台机器存储。* I$ {1 K4 q' w1 D$ b% d
(一)全备份,包含两个文件hotcopy.bat和最终执行文件fullbackup.bat5 e9 w+ z0 a+ n2 u
1) hotcopy.bat. ~7 Q7 T1 o( t* e! ?2 q
@echo 正在备份版本库%1……
5 E1 \9 i) F" W4 S/ ?9 Yrem @%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2- A- w. n7 Y( t3 \: o; T: v  P
@%SVN_HOME%\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%24 y) a. |' r$ a) J% i* E* q
@echo 版本库%1成功备份到了%2!% I, p8 ]3 w3 N3 _

& h) e/ R3 I1 |; d' r7 o
) w8 ~2 ?4 W( L2 L2 r# w" q6 }6 ]" _2)fullbackup.bat8 L+ Y$ K+ R7 r' `; k( `- b
echo off
- E4 @3 b1 P' B# z2 Orem Subversion的安装目录9 s! r; d1 ?$ L
rem set SVN_HOME="F:\Program Files\Subversion"
9 U( T* q) b7 ], {set SVN_HOME="F:\Program Files\CollabNet Subversion Server"/ W# c1 T% V: O4 b' v, Z
rem 所有版本库的父目录
4 o$ v: k' b, P4 q  u# m5 {set SVN_ROOT=G:\SVN
" ^( z" w5 @/ k  d0 E+ brem 备份的目录- J0 ~* |5 y7 r, \+ j( G- g
set BACKUP_SVN_ROOT=h:\svnrootbak
0 b  o* P  ?! N+ d: j( Cset BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%5 J! ^. w! k, L1 k) E
; F- J2 N- B7 ~8 ?8 z1 Q
if exist %BACKUP_DIRECTORY% goto checkBack
8 ?" ^. y2 Z1 l# qecho 建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/fullbackup.log+ z# Z  Z- `4 t4 u8 f$ t
mkdir %BACKUP_DIRECTORY%, k6 P3 @% F/ x
rem 验证目录是否为版本库,如果是则取出名称备份
2 z9 O9 D& S4 S8 Kfor /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" hotcopy.bat "%%~fI" %%~nI
. X0 [! t8 S3 v/ sgoto end. ?8 U9 B) ]" j
:checkBack
1 e0 \% A/ C) \& u0 z) {* xecho 备份目录%BACKUP_DIRECTORY%已经存在,请清空。
' `) ~/ T+ N8 q& X1 x- jgoto end
1 w$ E/ ^; A6 `! B( \:end' t8 m' i+ R$ k% U
) o2 v" p5 U- L1 Z& Y: ~0 s

& S% V) h9 h+ A/ ^" F(二)增量备份,包含三个文件,dump.bat、最终执行文件svndump.bat和配置库名称配置projectlist.conf+ s7 Q  t: F) P, i0 c
1)dump.bat
4 V* d. S* i: v) ~! E@ECHO OFF$ K% p7 M* M6 t3 }9 p
rem 调用格式:dump 项目库名
5 j3 z* N/ ]5 F8 ?  p3 rif "%1"=="" goto no_args
" M3 b3 J# ?7 E, A9 \0 j" dset PROJECT=%1) n% I+ G; c8 B/ N
if not exist %RAR_STORE%\%PROJECT% mkdir %RAR_STORE%\%PROJECT%; F: ?0 E* p- F$ U1 y+ N$ `
cd %RAR_STORE%\%PROJECT%
) H4 ~, n$ e2 Z" a) B# FSET LOWER=0
1 r" [: ^; E' sSET UPPER=0) ?5 Q1 M0 ?9 b$ f% a* H

3 g; a, ]: s0 i3 i1 r4 m* K1 m@echo 项目库%PROJECT%2...>> %Log_PATH%\%PROJECT%_log.txt' G0 n3 ?3 ^# O  N
%SVN_LOOK% youngest %SVN_REPOROOT%\%PROJECT%> %Log_PATH%\A.TMP
7 v. e% l; }' s1 ~0 r4 S& g- L@echo 项目库%PROJECT%3...>> %Log_PATH%\%PROJECT%_log.txt
( A% d7 S6 Z# U% H+ t1 h9 d. s@FOR /f %%D IN (%Log_PATH%\A.TMP) DO set UPPER=%%D
- B' ]5 n2 |- {5 B/ jif %UPPER%==0 GOTO :N_EXIT# G1 r6 L2 B+ E  P- F# u% r, O
if not exist %Log_PATH%\%PROJECT%_last_revision.txt GOTO :BAKUP1 F2 H; C9 h* w  }- E+ d
rem 取出上次备份后的版本号,并做+1处理(注意此算法未在98系统验证)9 x* K# v9 Z5 j) D5 f0 i
@FOR /f %%C IN (%Log_PATH%\%PROJECT%_last_revision.txt) DO @set LOWER=%%C
" e( T' T% l5 a0 \( {$ E! i% d4 }@set /A LOWER=%LOWER%+1
0 d( d# Q/ J: e- y5 vrem 不需要备份,则跳转结束
! E  l" a0 r" ]8 V# @# j3 PIF %LOWER% gtr %UPPER% GOTO :N_EXIT
2 L4 ^! i+ g; v9 W: J) {& G& p% \3 W; O( I
:BAKUP, J! E# O) _4 x+ r. u9 |
SET FILENAME=%PROJECT%_%LOWER%_%UPPER%6 |. k5 i# d6 c# a& V# w+ }+ q
@ECHO 开始备份项目库:%PROJECT%,生成文件=%FILENAME%
. ]; o8 i; _3 y+ J  D+ f0 a%SVN_ADMIN% dump %SVN_REPOROOT%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp" r  A, _6 ~! v, f; U$ A+ D
rem %RAR_CMD% a -df %PROJECT%_%UPPER%.rar %- \) {. k4 g% G; S; g$ U7 Z7 X
rem 准备写备份日志信息
* X: b3 N$ o) }. Q) jIF %LOWER% gtr 0 GOTO :WRITENOTE( ~5 X' W$ j8 g* _7 \
@ECHO ------2-----%date% >> %Log_PATH%\%PROJECT%_log.txt" c# F$ T4 k% i  c, P. k3 k5 j
@echo  -- 3-------添加备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt$ O" B; X+ V! E# H8 C9 j
GOTO :COMPLETE
6 R6 d/ p( b* J: b+ P! b1 X  S5 D0 _: ]
:WRITENOTE# O; ~/ q) p* L+ k1 L6 A9 A
@ECHO %date% >> %Log_PATH%\%PROJECT%_log.txt
) ^( t: a: ~+ j% w! M@echo  -- 4------添加增量备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt! s5 G- U0 j' W, H/ ?

* o- |$ K: r1 K:COMPLETE
1 m. @& y$ A6 u3 V5 m. X: brem 下面一行用于拷贝备份文件到映射的驱动器上- n0 f2 Y: W& p" V  W4 T0 h) _. R
rem copy %PROJECT%.rar %RAR_STORE%\%PROJECT%\6 l1 Y" b" u% |7 O& M5 @
move %FILENAME%.dmp %RAR_STORE%\%PROJECT%\
/ u8 U' _* y4 L% k% a: E  y0 gdel %Log_PATH%\A.TMP
- W- c: K, R1 P3 |% h& @@echo %UPPER% > %Log_PATH%\%PROJECT%_last_revision.txt
$ f9 R* p' c. O& B6 R( @
' ~, X/ C* i2 x# V:N_EXIT; g1 {4 a3 R9 J* C8 {5 k: K1 J
@echo 项目库%PROJECT%处理结束...>> %Log_PATH%\%PROJECT%_log.txt' K4 N5 V9 v* Q6 r; e# T, }& @; F& ~
@CD..) T: ~  v' k! ]
@exit /B% M# I6 G; d2 ?. r3 Y
:no_args
; f$ ]6 A! Y  r: i@ECHO ON- q' b: v1 n. T
@echo "正确调用方法: dump 项目库名"1 a8 E6 a8 G' e1 p) M
+ T: M; R& ^1 N% r4 \3 d
3 ]3 L9 U- Q6 k+ ?) ?; X
2)svndump.bat & `0 [5 e# h3 ?8 E& C
echo off
4 o4 X7 r, [6 ]& i+ F; B  ^rem Subversion的安装目录及执行文件
5 P6 J" H7 x; q5 Q. u' V9 Gset SVN_HOME="F:\Program Files\CollabNet Subversion Server"2 r5 a+ V2 x' x6 }+ \
set SVN_ADMIN=%SVN_HOME%\svnadmin.exe
+ B5 @" _+ s8 n% l  q" j9 u/ Q: jset SVN_LOOK=%SVN_HOME%\svnlook.exe
- r7 a) _6 o" n6 a% M" f- Vrem 配置库仓库根目录* f6 Q: E+ G# L+ ]1 g. e& K
set SVN_REPOROOT=G:\SVN$ G! L) c( d( X: e
rem 压缩命令3 a8 e9 r, J! ]- s/ N
set RAR_CMD="E:\Progra~1\WinRAR\WinRAR": D! ?$ [" m+ b" U  L
rem 增量备份文件存放路径
. v1 i6 k5 z# @' e7 ?' N+ z: Jset RAR_STORE="H:\svnincrementW"1 _/ i# M3 v/ H0 t
rem 日志及最后一次备份修订号存放文件目录,以下是跟增量备份脚本目录同一目录
# v' j  _/ z( dset Log_PATH=G:\backup\incrementW
% C3 v" Z- R; ?3 M" Y! K9 M8 x* s) A3 }; V$ u0 g9 E
@echo 项目库%PROJECT%处理1...>> %Log_PATH%\%PROJECT%_log.txt' H% k7 ?( i+ q/ V3 r# ]# p
rem 读取项目库列表文件,并忽略其中;开头的行6 ?, T, i( ^) i) f' y8 Y6 r
FOR /f "eol=;" %%C IN (projectlist.conf) DO  call G:\backup\incrementW\dump.bat %%C
9 `1 g# `, g- g
8 }0 [1 ?! L  n1 a
( b4 r2 _* K" Y( t5 b3 Z3)projectlist.conf
, j4 r4 X/ \+ ^  |% Q4 s;**************************************************
# g) f( @& k% I+ h8 Q: Y;01. project1开发库5 U' G, M1 ~) l: \7 Z2 u* v
;    更新频率: 高
( N5 Q  `4 x1 }8 q" Y6 \;**************************************************
3 [; i( f6 F3 vPROJECT1
4 U9 Z8 S- r1 E1 }2 e- [, {6 L% g;**************************************************
8 X% E4 L8 R4 t2 n;02. 此处可写注释信息  K' i) @. U/ B2 t: f0 F/ {1 ?) K- {% D
;**************************************************; u1 T0 R0 T% k0 ?
PROJECT2# e/ _5 [) Y( C& G0 `1 {
PROJECT3- p/ @1 r" d+ E8 O. W: |$ t8 n' |7 I
PROJECT4
0 F9 [: o" t+ r! |  Q  t% n+ rPROJECT5
) k# f/ w+ q& n1 n2 z
6 H: _' d( T/ l3 b[ 本帖最后由 千寻 于 2008-12-23 14:26 编辑 ]

本帖子中包含更多资源

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

x

评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

回复 楼主 的帖子

感谢千寻千大人分享关于SVN自动备份的脚本;
2 \6 S/ E  E. U& b! i; S大家的福音啊!!!
回复 支持 反对

使用道具 举报

发表于 2008-12-24 11:18:08 | 显示全部楼层
感谢版主分享~0 Z9 d8 B% T0 h4 }; `
呵呵8 ?( f6 G& b- ?" ?
分享 互助 共进~
回复 支持 反对

使用道具 举报

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

有没有分段备份的!

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

使用道具 举报

发表于 2008-12-24 13:09:51 | 显示全部楼层
可以选择备份一部分
# [8 ?5 G4 z0 u部分版本即可
回复 支持 反对

使用道具 举报

发表于 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,你这个增量备份的脚本如何使用 ? 能给个说明吗?3 M) ^0 a4 R, ?/ n7 ^
还有完全备份的脚本,我用了,目标备份目录如果不是空的话,执行脚本会报错,并不会去删除....
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

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

GMT+8, 2018-12-11 22:50 , Processed in 0.087238 second(s), 8 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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