SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 27303|回复: 52

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

  [复制链接]
发表于 2008-12-23 14:21:38 | 显示全部楼层 |阅读模式
一直用这套脚本备份,脚本主体虽不是原创,但是从网上得到后因为不能运行也进行了些修改,前两天看到有人问关于SVN备份的问题,今天又把脚本整理了一下,解决了不能循环备份多个配置库的问题。希望对大家有所帮助。在此也谢谢提供脚本主体的高人。
# [* ?# W( `3 [2 I& K/ ]我的备份策略是一个月一次全备份,一周一次增量备份,并且每天也进行增量备份,在Window任务里设置定时进行,设置好后就不用管了,再加一层保险就是定期把备份文件移到另外一台机器存储。
3 i4 g. y6 m, h! H' r9 N5 g) V(一)全备份,包含两个文件hotcopy.bat和最终执行文件fullbackup.bat
0 k, o1 t$ Z# F, y$ V+ G1) hotcopy.bat# k) E" Z+ @. k( M3 O- l2 v! w
@echo 正在备份版本库%1……3 B7 M2 X; d: k3 y3 K' Y
rem @%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%28 _  k) G8 `3 g( F% b9 i
@%SVN_HOME%\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2, u0 t: ?% Q5 p6 U# s, S! R
@echo 版本库%1成功备份到了%2!
+ E4 m' e( L' G2 {7 Q  Y
' ?4 f( o! p) ]
1 w5 A+ J# r5 h  C8 a) y. P8 K2)fullbackup.bat
3 }$ x/ M: w& D" m+ _4 O" Cecho off+ N' U1 P, p( ]7 R
rem Subversion的安装目录
) g9 W- Y& h: p1 orem set SVN_HOME="F:\Program Files\Subversion"# J  M% ~  a* h4 s2 f" W
set SVN_HOME="F:\Program Files\CollabNet Subversion Server"
+ N' i" k" g% g8 J$ H$ n6 |rem 所有版本库的父目录, u5 k' K9 q( R( s2 {2 Z7 G) S
set SVN_ROOT=G:\SVN
  h. f& z' I* B  p+ i0 Mrem 备份的目录
9 f0 Y' S2 R- M; M2 w5 zset BACKUP_SVN_ROOT=h:\svnrootbak, j$ J0 s( T2 B* `6 ^
set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%
! @( Q: v" r1 D# t! ?! @4 Q" X4 k# v
if exist %BACKUP_DIRECTORY% goto checkBack
3 I2 U6 w( |5 T. K' ], e* Iecho 建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/fullbackup.log
8 Z+ a2 a* I' ^/ ~mkdir %BACKUP_DIRECTORY%
. I6 i! A. Y! N( ]! T9 ^7 hrem 验证目录是否为版本库,如果是则取出名称备份
+ f0 ]2 e$ r% [- }+ J# x0 T( s4 S7 bfor /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" hotcopy.bat "%%~fI" %%~nI7 B9 A: q- ~* O- s* x, \
goto end$ Y" K+ k$ j4 x! _
:checkBack5 J" S1 p/ L! H5 i, h
echo 备份目录%BACKUP_DIRECTORY%已经存在,请清空。# c1 A& \( U8 {6 I( D2 T
goto end# H% d" j( l) }. a. i# i. |
:end; ^' ]; f6 k" V* Z

/ B( o; ?+ q, v$ T2 F
# @+ [1 Y! ~& C: h) X, M(二)增量备份,包含三个文件,dump.bat、最终执行文件svndump.bat和配置库名称配置projectlist.conf
) Q0 H9 V. q2 g9 T1)dump.bat" V' l3 B# f6 w9 F6 g
@ECHO OFF
$ U! t) o4 f( N/ Jrem 调用格式:dump 项目库名
2 o5 b6 @& v; @' w6 Gif "%1"=="" goto no_args3 Y( V3 D1 ]1 u8 S) M% z
set PROJECT=%1
2 W$ H- f* _! R$ F: s! ^0 Lif not exist %RAR_STORE%\%PROJECT% mkdir %RAR_STORE%\%PROJECT%+ T2 {; ~5 M2 X! ]( I! }
cd %RAR_STORE%\%PROJECT%
- e- n5 `% E; `6 @8 j2 ]SET LOWER=0. ]8 J0 w# N9 `. w6 |( y
SET UPPER=00 Z; B, \3 v* |4 y+ w4 t5 ~

& a# D6 D# a3 A4 w8 D- A@echo 项目库%PROJECT%2...>> %Log_PATH%\%PROJECT%_log.txt
+ ]8 f8 t6 [  `' \: b+ U%SVN_LOOK% youngest %SVN_REPOROOT%\%PROJECT%> %Log_PATH%\A.TMP
/ X2 W9 C" F- L@echo 项目库%PROJECT%3...>> %Log_PATH%\%PROJECT%_log.txt+ L$ H" h8 w: ^/ z7 K0 {1 \
@FOR /f %%D IN (%Log_PATH%\A.TMP) DO set UPPER=%%D
8 e5 e9 X$ |6 v8 Q# wif %UPPER%==0 GOTO :N_EXIT# p, J8 _5 L  z6 |; F* v4 m, S
if not exist %Log_PATH%\%PROJECT%_last_revision.txt GOTO :BAKUP$ o# E* j& I% L+ f/ t; n: s: K
rem 取出上次备份后的版本号,并做+1处理(注意此算法未在98系统验证)
! X0 y/ z6 D! H1 s( X@FOR /f %%C IN (%Log_PATH%\%PROJECT%_last_revision.txt) DO @set LOWER=%%C
$ Q( R' K9 K- p+ D@set /A LOWER=%LOWER%+1+ }; u. I. e1 k" e% A) a7 p: D- j
rem 不需要备份,则跳转结束" O% m: o8 ~8 W$ f' O# \9 S% T; S
IF %LOWER% gtr %UPPER% GOTO :N_EXIT9 p% K& ^( p+ F0 ~
4 w9 i' `, Q$ V' z6 c/ U
:BAKUP5 A1 x3 L- m4 O1 s& t5 h
SET FILENAME=%PROJECT%_%LOWER%_%UPPER%! Q# H7 }, s1 X
@ECHO 开始备份项目库:%PROJECT%,生成文件=%FILENAME%6 c: v2 H9 X7 q' M6 o
%SVN_ADMIN% dump %SVN_REPOROOT%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp1 a3 b" U( Z2 u, I6 C
rem %RAR_CMD% a -df %PROJECT%_%UPPER%.rar %
+ g# Z- h3 Q# m  S* R. @0 irem 准备写备份日志信息6 Y" G0 m7 S5 V6 R, S9 e
IF %LOWER% gtr 0 GOTO :WRITENOTE1 f; c5 T7 X) r( d; P  o0 U7 K0 G
@ECHO ------2-----%date% >> %Log_PATH%\%PROJECT%_log.txt
( ?( ^( p3 ?; x- o; c6 `@echo  -- 3-------添加备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt/ Q5 o/ g: l0 h; K+ q# J
GOTO :COMPLETE$ Q+ `3 l2 Z7 s. e; }  u
5 Y4 \: c8 I, r& F7 N" X
:WRITENOTE' ~2 k% a) z0 U4 x# p0 f
@ECHO %date% >> %Log_PATH%\%PROJECT%_log.txt) u2 W; a5 U6 t0 {, c3 s' l- b" |
@echo  -- 4------添加增量备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt, G$ q1 ^5 S5 ^% Q8 P# u# F

+ h3 b  x+ R5 U$ R. E: a$ r:COMPLETE
* Y! K9 |6 `% r& \/ Grem 下面一行用于拷贝备份文件到映射的驱动器上
/ J5 z' Q9 R2 f( J+ erem copy %PROJECT%.rar %RAR_STORE%\%PROJECT%\1 J3 s% |" e8 |  V3 {' t# s9 E
move %FILENAME%.dmp %RAR_STORE%\%PROJECT%\
5 b; [7 c9 l0 j$ B5 c0 z8 _6 L) o8 cdel %Log_PATH%\A.TMP
9 ]' R% _% h6 y$ q@echo %UPPER% > %Log_PATH%\%PROJECT%_last_revision.txt5 P3 B& E) n. t$ |: i8 n! L

0 [6 z( i$ t: e( U+ `" @:N_EXIT6 S2 S7 U4 t& ~  c6 [
@echo 项目库%PROJECT%处理结束...>> %Log_PATH%\%PROJECT%_log.txt
4 b( O( c$ a# m8 }@CD../ H/ p! ]( u% I
@exit /B
; l/ Q$ S5 ~- X0 z( `1 z+ W9 A:no_args
8 {# i  Q- w+ T7 ]6 R  X/ I@ECHO ON
3 S1 i  m9 ]5 o1 S@echo "正确调用方法: dump 项目库名"' T# G( Z5 T2 q1 @! f. O

& F7 e; @/ h- A1 T( u1 }6 e' J8 N% O$ ~  Z$ o' ?1 ?) M6 |
2)svndump.bat
  A) ~# R; g! l' Xecho off! u/ J1 ^% c) ~3 L. w/ Q
rem Subversion的安装目录及执行文件6 M" ]1 ]+ R0 z; J$ i4 Q- O- |
set SVN_HOME="F:\Program Files\CollabNet Subversion Server"
- Y; s; n1 \9 Q5 ]+ n- ]1 m. f3 Jset SVN_ADMIN=%SVN_HOME%\svnadmin.exe
: \' s* p. p1 l% V8 P# P$ @1 Lset SVN_LOOK=%SVN_HOME%\svnlook.exe
' q5 B" M$ A. g" W& W1 Vrem 配置库仓库根目录
+ A- y  @5 n7 Z; K/ w9 o( Jset SVN_REPOROOT=G:\SVN
) P( ~( L7 H1 Y2 C, u' `/ Z  J+ Drem 压缩命令1 K0 T1 c# X* z/ t8 a* K& I
set RAR_CMD="E:\Progra~1\WinRAR\WinRAR"' l( ]' p- ^3 d
rem 增量备份文件存放路径
3 E* s" U' {) y0 o. W8 h' e6 bset RAR_STORE="H:\svnincrementW"7 z! ]1 _& ]2 u/ _+ ?& @
rem 日志及最后一次备份修订号存放文件目录,以下是跟增量备份脚本目录同一目录; J( Q4 {( u  W6 S4 {* r
set Log_PATH=G:\backup\incrementW  E! r- N; r, X6 U* _

' Q# y* D; Q1 `8 j' C@echo 项目库%PROJECT%处理1...>> %Log_PATH%\%PROJECT%_log.txt% w! I6 Z7 r( s/ T# j; d
rem 读取项目库列表文件,并忽略其中;开头的行
8 O, e3 B) |/ |7 n% \4 JFOR /f "eol=;" %%C IN (projectlist.conf) DO  call G:\backup\incrementW\dump.bat %%C2 X" P% ]  S7 D- _/ z3 t) N

0 v3 f0 Z: u+ @9 B! S0 i( R/ D. X' j% A+ V& a" e# j
3)projectlist.conf
9 ~* D0 r$ z* S* A, ~0 O  h# \;**************************************************
; C% A2 u5 |! P6 M, T9 G( q;01. project1开发库1 G& w; b7 B% j( A' w# }) q
;    更新频率: 高' [2 U; V5 B/ j2 u/ n" z
;**************************************************- [5 p$ i' N) Y# H5 o- s: i* ]
PROJECT1
. W5 ^: E9 U$ X9 F6 m: J6 |3 ~+ x;**************************************************
' e; |6 e6 P, e3 a;02. 此处可写注释信息2 e0 w+ W5 ]) h. T, A) u5 M
;**************************************************
" m" a2 z# n! ]; {PROJECT2
7 N% K" u. G" i, }: pPROJECT39 _: |$ J! [5 B% b2 u
PROJECT4! Z. A, P" U! f! I/ ^
PROJECT57 O, C- t2 S6 N+ [

# E. t# W( \  d% N. w6 x[ 本帖最后由 千寻 于 2008-12-23 14:26 编辑 ]

本帖子中包含更多资源

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

x

评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

回复 楼主 的帖子

感谢千寻千大人分享关于SVN自动备份的脚本;
* W6 u7 l/ H6 w' h$ |大家的福音啊!!!
回复 支持 反对

使用道具 举报

发表于 2008-12-24 11:18:08 | 显示全部楼层
感谢版主分享~* k8 W& ]0 e3 V* z7 w, i9 P: Y
呵呵
( C# f) L4 I9 k0 m/ l7 Y分享 互助 共进~
回复 支持 反对

使用道具 举报

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

有没有分段备份的!

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

使用道具 举报

发表于 2008-12-24 13:09:51 | 显示全部楼层
可以选择备份一部分
2 l$ _6 [) M. E; p6 }部分版本即可
回复 支持 反对

使用道具 举报

发表于 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 s2 ]/ J4 G5 j6 N6 L' _' W: V还有完全备份的脚本,我用了,目标备份目录如果不是空的话,执行脚本会报错,并不会去删除....
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

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

GMT+8, 2018-9-19 23:38 , Processed in 0.074141 second(s), 8 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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