SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 25309|回复: 52

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

  [复制链接]
发表于 2008-12-23 14:21:38 | 显示全部楼层 |阅读模式
一直用这套脚本备份,脚本主体虽不是原创,但是从网上得到后因为不能运行也进行了些修改,前两天看到有人问关于SVN备份的问题,今天又把脚本整理了一下,解决了不能循环备份多个配置库的问题。希望对大家有所帮助。在此也谢谢提供脚本主体的高人。) s, Z1 C( {, a  a# Y
我的备份策略是一个月一次全备份,一周一次增量备份,并且每天也进行增量备份,在Window任务里设置定时进行,设置好后就不用管了,再加一层保险就是定期把备份文件移到另外一台机器存储。! r, }! J& e2 ]2 s& p% R; D6 G: H
(一)全备份,包含两个文件hotcopy.bat和最终执行文件fullbackup.bat
7 x* x7 S4 {' Z9 a% g  v4 l1) hotcopy.bat
. g0 K$ q9 j. Y. M$ G; p0 l, y@echo 正在备份版本库%1……
3 e1 s! V8 g4 W# D7 V/ trem @%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2
; Y, {& A1 J4 a@%SVN_HOME%\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2
2 |3 ~) j: }8 }& \@echo 版本库%1成功备份到了%2!5 e! H# H4 v1 a! }
7 J1 i1 k" D  l" {8 S8 q! G

9 T9 S2 J* Z; }, j1 t# `: S2)fullbackup.bat
. h1 Z% ]" l  |# b; F1 q$ E% Iecho off: _. m% ^  s. i# s9 m
rem Subversion的安装目录
6 U/ Z2 U( \4 |) `; `, A1 X2 {0 Crem set SVN_HOME="F:\Program Files\Subversion". ~, S/ ^" ~- `0 o
set SVN_HOME="F:\Program Files\CollabNet Subversion Server"
0 J& j8 Z4 h7 Z4 L" a* ^( Hrem 所有版本库的父目录/ a! [. [+ ?9 u1 P( t
set SVN_ROOT=G:\SVN7 G- r+ ~; u' m
rem 备份的目录" u$ B7 F0 c6 V
set BACKUP_SVN_ROOT=h:\svnrootbak
3 b: M4 a. O4 x( Hset BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%; e4 Q! T, {3 l( J/ `1 @% c, k

8 L! [1 w1 l1 M: Y) u8 Tif exist %BACKUP_DIRECTORY% goto checkBack
& `: q+ F) \. `& Recho 建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/fullbackup.log
! n  ~5 K( `) k  m! y4 mmkdir %BACKUP_DIRECTORY%, j, M" ]. b, `" K$ m$ I
rem 验证目录是否为版本库,如果是则取出名称备份; O; H& {9 Y1 N; B! y
for /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" hotcopy.bat "%%~fI" %%~nI, o; n0 A1 v. ^- q
goto end
# R7 U7 {2 @* _:checkBack
3 R7 ^9 L- I2 j" Pecho 备份目录%BACKUP_DIRECTORY%已经存在,请清空。) A" F" @8 W' C/ M; |3 j
goto end' N- a" E$ t! F/ t2 v/ A; a
:end
6 L" h! v# S% f9 k
7 ]+ [( M6 b, J7 f# f5 T0 C
& x0 A4 m4 ?" Y(二)增量备份,包含三个文件,dump.bat、最终执行文件svndump.bat和配置库名称配置projectlist.conf
+ {$ {0 Z# z4 h- I5 c3 k1)dump.bat0 L1 k1 ^+ x- A$ @, }+ W# C
@ECHO OFF
) e5 T- L5 O: O/ Jrem 调用格式:dump 项目库名
# z6 S% ]- f# Mif "%1"=="" goto no_args
9 a- _. A8 M' X* B# |7 q% Uset PROJECT=%1$ F! h" y+ q1 [! P: @6 D" R, o2 f
if not exist %RAR_STORE%\%PROJECT% mkdir %RAR_STORE%\%PROJECT%
* @% q2 b0 K/ |, |/ d9 _cd %RAR_STORE%\%PROJECT%
  E& j5 l5 F$ s! |SET LOWER=0
4 A% M8 _4 ^) ~; FSET UPPER=0- T* Q+ t/ z4 y. ~  r
+ m. r! t1 C) d  f  y
@echo 项目库%PROJECT%2...>> %Log_PATH%\%PROJECT%_log.txt% T- Y5 t  `, y. t
%SVN_LOOK% youngest %SVN_REPOROOT%\%PROJECT%> %Log_PATH%\A.TMP
. R( [" }4 [0 q3 [@echo 项目库%PROJECT%3...>> %Log_PATH%\%PROJECT%_log.txt
: c! P; u6 r. v1 v@FOR /f %%D IN (%Log_PATH%\A.TMP) DO set UPPER=%%D
/ n( l4 l6 t# w0 U" Pif %UPPER%==0 GOTO :N_EXIT
# ~! {8 }- h0 D% h4 cif not exist %Log_PATH%\%PROJECT%_last_revision.txt GOTO :BAKUP
* ^, s$ @5 @# _rem 取出上次备份后的版本号,并做+1处理(注意此算法未在98系统验证)
* a+ ?  z2 r% k/ C; d3 p@FOR /f %%C IN (%Log_PATH%\%PROJECT%_last_revision.txt) DO @set LOWER=%%C
( d2 Q* s. W* h3 A0 M7 m@set /A LOWER=%LOWER%+1# ?" o- s5 E, W& Z. Q" s
rem 不需要备份,则跳转结束
3 U. m0 A# k, Z7 e5 H. H2 |4 LIF %LOWER% gtr %UPPER% GOTO :N_EXIT
2 g* E* [1 m) d* x0 U. u/ M
: q! N) U* ]8 X& u! \7 x:BAKUP
7 ^1 t1 Q/ V; a6 [SET FILENAME=%PROJECT%_%LOWER%_%UPPER%
' w% R' k+ a7 [. H" @9 \6 }6 T& I/ G@ECHO 开始备份项目库:%PROJECT%,生成文件=%FILENAME%
3 `; ^+ k' K- B- i2 c& m%SVN_ADMIN% dump %SVN_REPOROOT%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp; Y6 Z% x2 @& X; I$ G5 V
rem %RAR_CMD% a -df %PROJECT%_%UPPER%.rar %% V+ C% t+ n  P8 J0 A4 x7 H
rem 准备写备份日志信息
( e) j2 ^% n( F4 TIF %LOWER% gtr 0 GOTO :WRITENOTE
+ R5 q7 N0 z4 f+ y+ _  l( L@ECHO ------2-----%date% >> %Log_PATH%\%PROJECT%_log.txt% Q- [; t: q  j
@echo  -- 3-------添加备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt
3 M0 P( y3 P8 \; Z9 UGOTO :COMPLETE/ E; {* V5 l. I6 R7 p
% I7 C3 e% F9 C7 ?. A/ f' m
:WRITENOTE7 l) H. k! A  E
@ECHO %date% >> %Log_PATH%\%PROJECT%_log.txt
' O5 e# L1 N" m7 B3 ^@echo  -- 4------添加增量备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt5 }: ~5 ~7 c" d2 Y

& E7 H9 V  n* A, o:COMPLETE
+ j/ m% s& `0 B, T7 ^& irem 下面一行用于拷贝备份文件到映射的驱动器上
6 F4 q; ~. @: m, H; _rem copy %PROJECT%.rar %RAR_STORE%\%PROJECT%\
  D5 {. S/ `2 Xmove %FILENAME%.dmp %RAR_STORE%\%PROJECT%\
- O, B( T1 u3 r) h$ d6 m+ Kdel %Log_PATH%\A.TMP
4 }, c* @( G* [@echo %UPPER% > %Log_PATH%\%PROJECT%_last_revision.txt
4 ]' y$ Q0 [9 m1 Z8 ~2 ^: `) b6 q$ T) o  f  H* ^
:N_EXIT
8 x. U# b! C) D/ u$ D@echo 项目库%PROJECT%处理结束...>> %Log_PATH%\%PROJECT%_log.txt1 M3 }+ z( N! ^- p
@CD..7 g# ^" K( B. _& d+ A
@exit /B
5 ?0 r3 `4 c. r, m0 m5 O9 u:no_args4 R; W( N- B: G8 t* U' L
@ECHO ON
: Q1 v! @+ U1 t1 E4 @% _@echo "正确调用方法: dump 项目库名"
: L3 I, o$ I7 B, Z. y4 K
. F" d" l: F6 j; o1 n; ~1 k6 D% q1 R) u; M1 I5 F( I
2)svndump.bat % s8 H; s4 N0 D/ T; Y
echo off
* @' D9 v9 Z7 c- z( Xrem Subversion的安装目录及执行文件- Q3 o$ @: S/ `/ w& t8 p/ k( ^
set SVN_HOME="F:\Program Files\CollabNet Subversion Server"$ w4 Q  s" d2 v/ B" e
set SVN_ADMIN=%SVN_HOME%\svnadmin.exe# {4 y4 u5 Y# \. }: [. j: m5 V& A
set SVN_LOOK=%SVN_HOME%\svnlook.exe
4 u# G; |/ D8 V2 v9 E6 n) c  Mrem 配置库仓库根目录+ `' F3 c9 ^% ]- m9 s
set SVN_REPOROOT=G:\SVN5 X2 l. [' S  `+ }
rem 压缩命令
. ^6 m5 C1 O0 K$ qset RAR_CMD="E:\Progra~1\WinRAR\WinRAR"
* r% n; M4 }0 L8 W0 ]rem 增量备份文件存放路径/ W( I7 }% f$ _# z# N, c
set RAR_STORE="H:\svnincrementW"" J$ y( [" R) S: W2 V! ?
rem 日志及最后一次备份修订号存放文件目录,以下是跟增量备份脚本目录同一目录
. o, V2 m2 C: U5 U% a1 O9 yset Log_PATH=G:\backup\incrementW) b! X/ Q  {# k9 h

, _7 w& Z; u# p+ A2 O  s@echo 项目库%PROJECT%处理1...>> %Log_PATH%\%PROJECT%_log.txt2 T( Z8 h: d. s$ K: V% \
rem 读取项目库列表文件,并忽略其中;开头的行
; j9 M) I+ {$ S$ b( w- EFOR /f "eol=;" %%C IN (projectlist.conf) DO  call G:\backup\incrementW\dump.bat %%C! g) L/ y/ W- m, I5 q

' N1 A* x8 B2 V2 f- Y/ k: v7 m8 M8 [! v  [3 A1 K, B
3)projectlist.conf
$ S0 j! [+ u1 X* Z6 [7 q" d/ S( P;**************************************************6 l4 k! s2 a. s+ U3 P% ]8 z! z
;01. project1开发库% C, Q2 ?% d. N. a& ?' ^
;    更新频率: 高6 Q! `* \) r9 C0 a. W7 i" c7 ^
;**************************************************
- [* d9 f' W4 p0 ~PROJECT1" y* B0 A5 |4 K# n" V
;**************************************************
1 e4 e6 G. E4 l; S' S;02. 此处可写注释信息
9 U) I  E/ \- i9 K8 i/ M$ a) P;**************************************************
0 U( T8 v+ M3 o; s7 sPROJECT21 K) P- Q; I+ d( I7 N
PROJECT32 o- N4 n8 ?; Y/ A8 E3 s
PROJECT4
( v  O$ E% P9 zPROJECT5
; H- q% W7 {7 K! a( E( K
+ ]: z/ o( A' F" w8 h[ 本帖最后由 千寻 于 2008-12-23 14:26 编辑 ]

本帖子中包含更多资源

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

x

评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

回复 楼主 的帖子

感谢千寻千大人分享关于SVN自动备份的脚本;; l* g/ l4 o1 n0 v8 T0 F% x+ U5 {
大家的福音啊!!!
回复 支持 反对

使用道具 举报

发表于 2008-12-24 11:18:08 | 显示全部楼层
感谢版主分享~
! O+ O; P- j+ R  k呵呵
0 S6 {& E- J/ _5 a1 l$ h$ L! X* S分享 互助 共进~
回复 支持 反对

使用道具 举报

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

有没有分段备份的!

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

使用道具 举报

发表于 2008-12-24 13:09:51 | 显示全部楼层
可以选择备份一部分
- r+ `) o$ q4 `) x部分版本即可
回复 支持 反对

使用道具 举报

发表于 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 }+ V' R2 [: s还有完全备份的脚本,我用了,目标备份目录如果不是空的话,执行脚本会报错,并不会去删除....
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-1-18 09:08 , Processed in 0.077845 second(s), 11 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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