SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 29215|回复: 52

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

  [复制链接]
发表于 2008-12-23 14:21:38 | 显示全部楼层 |阅读模式
一直用这套脚本备份,脚本主体虽不是原创,但是从网上得到后因为不能运行也进行了些修改,前两天看到有人问关于SVN备份的问题,今天又把脚本整理了一下,解决了不能循环备份多个配置库的问题。希望对大家有所帮助。在此也谢谢提供脚本主体的高人。/ m) r/ b) V5 t6 Z7 T  q7 O
我的备份策略是一个月一次全备份,一周一次增量备份,并且每天也进行增量备份,在Window任务里设置定时进行,设置好后就不用管了,再加一层保险就是定期把备份文件移到另外一台机器存储。0 B' ?3 Y1 R) N4 @* ?8 H
(一)全备份,包含两个文件hotcopy.bat和最终执行文件fullbackup.bat
7 S5 @# \( V1 S+ m7 X1) hotcopy.bat9 c: j! T! i0 C7 g6 P; T& D
@echo 正在备份版本库%1……
2 r1 [! V- I. \6 D2 {+ x$ R0 `  Drem @%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2/ S9 |& U8 I% f  m
@%SVN_HOME%\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%23 c' w+ K2 o* M2 f: O
@echo 版本库%1成功备份到了%2!
+ y# j3 X* C. V7 D( e& |) H5 O' _" h9 m0 j/ d. e8 i) w( [

! ~3 V  w* r# I) \# {; _3 z! B2)fullbackup.bat0 I' t: h2 m3 @0 n1 E/ ~. _
echo off
" w1 m- c; {1 Y" l9 a+ Arem Subversion的安装目录
* Q$ V+ V# `9 l/ ^0 S2 H+ c/ qrem set SVN_HOME="F:\Program Files\Subversion"8 W# a0 X. q2 f* S6 W+ a
set SVN_HOME="F:\Program Files\CollabNet Subversion Server"  p+ ~- W+ F/ X& v
rem 所有版本库的父目录
1 L, _# L8 d9 A' I, ~$ Pset SVN_ROOT=G:\SVN/ L4 V* ^4 a' V
rem 备份的目录
6 r" q$ ~5 d8 L& z( Y$ J5 j3 ^set BACKUP_SVN_ROOT=h:\svnrootbak
- o2 h$ d. D; C6 ~8 s( N8 k$ Gset BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%& F) n4 H% d' M* L6 G

4 \* f. r) R7 i& e2 d8 Aif exist %BACKUP_DIRECTORY% goto checkBack
& @6 N4 t/ s# l' F$ R/ _echo 建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/fullbackup.log/ {! }* ?' p+ r% N8 X2 W
mkdir %BACKUP_DIRECTORY%; o& m5 l% l' z7 s  f3 u6 s- u  R2 \4 P
rem 验证目录是否为版本库,如果是则取出名称备份) _* ~  q' b; k
for /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" hotcopy.bat "%%~fI" %%~nI* j3 l- Z0 |! I! b) G  o+ Z$ L4 A
goto end/ K& b( `$ |  I+ V' ~
:checkBack( {  ]+ F: z+ W/ D7 F+ |, N
echo 备份目录%BACKUP_DIRECTORY%已经存在,请清空。1 v. R' K+ D9 ~; \) M
goto end- M* _, l8 K/ L9 Y. ~4 I0 `
:end
; X1 X) F9 U# G/ i( ]% v/ P+ k0 o. Z! f8 i) ~3 b( Y
& Q3 }1 ?, ^, n7 A6 Y+ k
(二)增量备份,包含三个文件,dump.bat、最终执行文件svndump.bat和配置库名称配置projectlist.conf
# h8 j$ {- S$ {' ~/ |; U- V1)dump.bat* K, a& H7 X  a  V9 ?" T
@ECHO OFF" z5 b! `' C0 r# H+ o
rem 调用格式:dump 项目库名
) l, h% z; `/ M3 D5 cif "%1"=="" goto no_args
& r9 H6 x. G3 S% O* O+ hset PROJECT=%1
; _) F# Q! ~" z9 a( K9 `if not exist %RAR_STORE%\%PROJECT% mkdir %RAR_STORE%\%PROJECT%
6 X' L: m( c' V3 Ecd %RAR_STORE%\%PROJECT%; ^" Z4 q; A( T% o
SET LOWER=0
# s' ^/ v% o* W( W) D, Q5 ?/ P) ^6 kSET UPPER=00 r8 B% ?2 \  W3 i# Y7 W7 A
( G9 d0 v* E5 E; m1 u& `$ J
@echo 项目库%PROJECT%2...>> %Log_PATH%\%PROJECT%_log.txt
* g8 C/ U9 c: F' g%SVN_LOOK% youngest %SVN_REPOROOT%\%PROJECT%> %Log_PATH%\A.TMP
' }. b( Y/ ~) U  ^' G5 X  L@echo 项目库%PROJECT%3...>> %Log_PATH%\%PROJECT%_log.txt
/ v- p  x' k0 W# T; i: y@FOR /f %%D IN (%Log_PATH%\A.TMP) DO set UPPER=%%D
3 |5 r+ x  o9 Rif %UPPER%==0 GOTO :N_EXIT4 D0 \3 v) j1 d1 |# K( v+ x
if not exist %Log_PATH%\%PROJECT%_last_revision.txt GOTO :BAKUP# A" w. l8 j. P
rem 取出上次备份后的版本号,并做+1处理(注意此算法未在98系统验证)
) s7 S4 x  z# s( d7 h@FOR /f %%C IN (%Log_PATH%\%PROJECT%_last_revision.txt) DO @set LOWER=%%C
% g4 |4 U+ m. J- d" [@set /A LOWER=%LOWER%+1
' z& E- I$ Y1 Q" C, \5 srem 不需要备份,则跳转结束
5 A5 D* a6 n1 b# ~# ~9 oIF %LOWER% gtr %UPPER% GOTO :N_EXIT
: n  M0 x+ L9 w9 P' c& l0 K
; E( d9 E, l' L( j8 z3 C& b2 f:BAKUP
# e" Q4 ^6 G8 O6 ?; G8 GSET FILENAME=%PROJECT%_%LOWER%_%UPPER%
7 k- f$ N- Q2 `! X7 d  A+ [9 M@ECHO 开始备份项目库:%PROJECT%,生成文件=%FILENAME%
, {! z! g) j9 c4 c  H) x5 l. J2 _%SVN_ADMIN% dump %SVN_REPOROOT%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp: u8 i- D9 J% z9 @# {
rem %RAR_CMD% a -df %PROJECT%_%UPPER%.rar %- I" e; Z/ V$ u0 k; A
rem 准备写备份日志信息. M! }5 [6 o, ]) q$ J8 q
IF %LOWER% gtr 0 GOTO :WRITENOTE
! _/ F7 c- f8 l9 M1 W2 T( x* ~@ECHO ------2-----%date% >> %Log_PATH%\%PROJECT%_log.txt
4 @4 }$ c' B" s9 t5 K* m3 R4 d, _6 W# F@echo  -- 3-------添加备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt9 ~/ R0 _5 L8 H8 N( D$ J
GOTO :COMPLETE, F7 I, f( P7 q# D1 p

* k8 a9 P1 J1 a  T8 z4 A& t:WRITENOTE
0 T, u, y6 s5 M( U$ a@ECHO %date% >> %Log_PATH%\%PROJECT%_log.txt# u1 K* t' N: \6 C; x( j  k4 J
@echo  -- 4------添加增量备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt
. A0 C0 Y( O# G/ X  G4 b
* H% K1 Z3 E/ e$ t9 E7 D; L& s: Z6 D:COMPLETE; i& x- m! g# p' ~8 s  _" l
rem 下面一行用于拷贝备份文件到映射的驱动器上
: w: Q+ A" E; u1 n  Prem copy %PROJECT%.rar %RAR_STORE%\%PROJECT%\* f9 }8 f+ c) e0 U
move %FILENAME%.dmp %RAR_STORE%\%PROJECT%\% B1 i8 c4 R# u
del %Log_PATH%\A.TMP
( K  c3 U6 x8 y, u3 L@echo %UPPER% > %Log_PATH%\%PROJECT%_last_revision.txt
2 x" q8 e0 |3 P3 d; Z; w# A$ C  @6 {3 W+ Q
:N_EXIT
1 O% }/ j5 s) r& E% p% K@echo 项目库%PROJECT%处理结束...>> %Log_PATH%\%PROJECT%_log.txt) T, k; m! i0 v) y! v( _7 Z
@CD..
2 \7 U' T. E9 a1 G4 l9 m5 f@exit /B+ n5 T/ f6 v1 U  w
:no_args
8 h+ x: k$ f0 `5 D' O@ECHO ON
) r# ?1 c  ~8 {& u; Z: s@echo "正确调用方法: dump 项目库名"$ q7 L" f% n. W: y5 q

3 `9 p* W/ @. d% I
' k' q* `' P7 R+ K! s, Y2)svndump.bat ! |5 u5 |# _& C
echo off: W! S$ T) y- _" d# f4 F
rem Subversion的安装目录及执行文件4 W9 A" b% p, K5 Y1 g
set SVN_HOME="F:\Program Files\CollabNet Subversion Server"9 ^) s, |% u7 X# Q* z, Q
set SVN_ADMIN=%SVN_HOME%\svnadmin.exe
. N1 _# `+ `2 X# G$ o+ x% C1 Z; F# fset SVN_LOOK=%SVN_HOME%\svnlook.exe; C1 }& a6 a4 z' r. w
rem 配置库仓库根目录
; w7 y$ I8 ]' |set SVN_REPOROOT=G:\SVN. B5 K; L* k* e) P* k) h
rem 压缩命令4 P0 l7 `4 _( [* c7 e2 S9 R5 v; q
set RAR_CMD="E:\Progra~1\WinRAR\WinRAR"' @2 Y9 c  G& Y8 {, H6 F. ~3 d6 Y
rem 增量备份文件存放路径
! t- [* S3 u( I% gset RAR_STORE="H:\svnincrementW"9 [2 `% R- ~7 g# U( O5 g2 c
rem 日志及最后一次备份修订号存放文件目录,以下是跟增量备份脚本目录同一目录/ Q! A, {. M0 m
set Log_PATH=G:\backup\incrementW
4 E2 s3 y/ b5 v% o
+ ]) ]( _* H  ?@echo 项目库%PROJECT%处理1...>> %Log_PATH%\%PROJECT%_log.txt
1 Q3 N0 Z6 b: a( Z/ b+ q3 E2 L: Rrem 读取项目库列表文件,并忽略其中;开头的行
* G, c( ^0 k4 `4 P$ |; k* pFOR /f "eol=;" %%C IN (projectlist.conf) DO  call G:\backup\incrementW\dump.bat %%C
6 C% C+ c( c# z+ Y7 V* \6 I
9 a- j/ H! P" K: P# Y8 l  q
. J) Q0 ?9 b+ a! i3)projectlist.conf* D" Y2 Z% i2 f1 N4 F- b9 }0 ]* R
;**************************************************1 a- C$ l+ p' Q% k
;01. project1开发库' q  j( \$ D+ E; B1 M% k$ w: ^( P
;    更新频率: 高0 S$ M8 X& e" L' W/ t  b+ _" c
;**************************************************0 d; j' j/ O3 _5 i9 n; S
PROJECT1
0 v5 `: R0 [; y; ~9 g9 d2 D8 X;**************************************************1 @  q! ^1 f+ [4 L& n  X- ?, E8 \
;02. 此处可写注释信息: r. |1 a/ s: r5 f
;**************************************************
6 F! ]6 B& e' a- \& a( Y4 `* V7 r0 DPROJECT2
- u$ y' b* A6 T/ _$ o. j, ^PROJECT3
, H4 p9 }0 s/ Q( h7 n4 l. {PROJECT43 ?4 N5 x9 ^: s; K- J2 P  r( u4 x" _
PROJECT5
0 z# h- I' W$ J! c" s2 B: R
: x: q6 f- Q; j( {" k, k[ 本帖最后由 千寻 于 2008-12-23 14:26 编辑 ]

本帖子中包含更多资源

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

x

评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

回复 楼主 的帖子

感谢千寻千大人分享关于SVN自动备份的脚本;
& d; F" b! R7 J6 |大家的福音啊!!!
回复 支持 反对

使用道具 举报

发表于 2008-12-24 11:18:08 | 显示全部楼层
感谢版主分享~/ T8 h7 ]5 K4 ~- s, i
呵呵+ ^$ i8 X- _+ x8 W! x( {' A; X
分享 互助 共进~
回复 支持 反对

使用道具 举报

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

有没有分段备份的!

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

使用道具 举报

发表于 2008-12-24 13:09:51 | 显示全部楼层
可以选择备份一部分
1 L. R8 Q- n& C7 f# m2 S4 v部分版本即可
回复 支持 反对

使用道具 举报

发表于 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,你这个增量备份的脚本如何使用 ? 能给个说明吗?! p- i0 h- ]# H9 Z: u2 H, c
还有完全备份的脚本,我用了,目标备份目录如果不是空的话,执行脚本会报错,并不会去删除....
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

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

GMT+8, 2019-4-24 15:05 , Processed in 0.068997 second(s), 8 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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