SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 35852|回复: 51

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

  [复制链接]
发表于 2008-12-23 14:21:38 | 显示全部楼层 |阅读模式
一直用这套脚本备份,脚本主体虽不是原创,但是从网上得到后因为不能运行也进行了些修改,前两天看到有人问关于SVN备份的问题,今天又把脚本整理了一下,解决了不能循环备份多个配置库的问题。希望对大家有所帮助。在此也谢谢提供脚本主体的高人。
; e4 u) y5 o" I( i# K我的备份策略是一个月一次全备份,一周一次增量备份,并且每天也进行增量备份,在Window任务里设置定时进行,设置好后就不用管了,再加一层保险就是定期把备份文件移到另外一台机器存储。
. r! Q8 h( f' T(一)全备份,包含两个文件hotcopy.bat和最终执行文件fullbackup.bat# E2 z4 h! ~7 l
1) hotcopy.bat- I$ m* d- p3 Z0 R4 o0 {* C* w
@echo 正在备份版本库%1……
% T& J$ f+ h' r. lrem @%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2/ R6 n& d$ j4 W& @2 W9 j5 g
@%SVN_HOME%\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2$ [7 a( E, v& e7 U
@echo 版本库%1成功备份到了%2!7 m' n1 o9 g9 m8 _6 M- u

4 {( e- X; u4 h* C% N4 p5 l
2 g8 C4 ^) s) b! o% t2)fullbackup.bat
) l4 g2 w* e  P, |  techo off2 _9 r) U' W- B  T! P& p; u2 {7 S
rem Subversion的安装目录* B8 l7 V* @( v2 J) H
rem set SVN_HOME="F:\Program Files\Subversion"( \1 S, c& d' k+ K" n
set SVN_HOME="F:\Program Files\CollabNet Subversion Server"" B0 \! u; b( K+ Y2 f5 X
rem 所有版本库的父目录
1 T: ?* q6 Y7 N. sset SVN_ROOT=G:\SVN
" J, m+ z9 R1 n6 y$ d) lrem 备份的目录
% B: ?- Q: f) T, i& J9 L5 gset BACKUP_SVN_ROOT=h:\svnrootbak
) J# L* M& w  A' V' {# Dset BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%
6 B# H0 c/ i. U7 b! k) }' h9 n+ `7 c
if exist %BACKUP_DIRECTORY% goto checkBack3 a1 P& c8 |2 x* q/ K: W
echo 建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/fullbackup.log
( K7 p0 \8 N5 v+ l6 _" u8 c# Dmkdir %BACKUP_DIRECTORY%) A% K" c' u* }' s9 t9 L
rem 验证目录是否为版本库,如果是则取出名称备份
' X; D5 `! f: s. o/ Gfor /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" hotcopy.bat "%%~fI" %%~nI
- t! v3 T+ p/ D2 ~3 k$ b7 [) ]goto end% p) _4 l9 B' d, w& j; D4 B
:checkBack
* m& \, o& ~9 C0 z6 jecho 备份目录%BACKUP_DIRECTORY%已经存在,请清空。
% @- H% l9 |; R7 X. |: ^goto end
9 C7 P* q: O. r. p. ~) y6 c:end+ K) |" B5 a2 R  b
' P# w5 \- l. K
8 a; E! M' u6 R; P. j
(二)增量备份,包含三个文件,dump.bat、最终执行文件svndump.bat和配置库名称配置projectlist.conf
+ x8 ~: }2 \7 }, ?1)dump.bat
. Y$ y! e) q; J! A4 Y& q1 H9 u7 K@ECHO OFF: L' ~* g: v( {! ]' J
rem 调用格式:dump 项目库名
5 }- L7 e. {3 O4 g0 lif "%1"=="" goto no_args
3 K, e0 k7 F% I: _3 \set PROJECT=%1. U2 _5 x: G: A/ e
if not exist %RAR_STORE%\%PROJECT% mkdir %RAR_STORE%\%PROJECT%# M: A( K: i! ~) [& D& f/ g+ }/ t
cd %RAR_STORE%\%PROJECT%. Z. u8 p9 h: G$ a* v4 m/ e
SET LOWER=0
. K9 X5 j) R4 r" ~SET UPPER=0% I, N% z: i, ]3 X$ w5 M. M

, Z" R0 j0 p% z- R@echo 项目库%PROJECT%2...>> %Log_PATH%\%PROJECT%_log.txt
7 \9 s+ g' i. {6 X%SVN_LOOK% youngest %SVN_REPOROOT%\%PROJECT%> %Log_PATH%\A.TMP
* Q, ~( M' k) d* U) d@echo 项目库%PROJECT%3...>> %Log_PATH%\%PROJECT%_log.txt$ c7 [! Q' R: X5 d! `
@FOR /f %%D IN (%Log_PATH%\A.TMP) DO set UPPER=%%D2 N8 G( L% s' k0 B0 t' y: z2 T
if %UPPER%==0 GOTO :N_EXIT
7 l, t" f: U" c4 P0 _$ X6 N; jif not exist %Log_PATH%\%PROJECT%_last_revision.txt GOTO :BAKUP
; Y& t9 p* d; _! Erem 取出上次备份后的版本号,并做+1处理(注意此算法未在98系统验证)
; Z3 b) d8 e# d@FOR /f %%C IN (%Log_PATH%\%PROJECT%_last_revision.txt) DO @set LOWER=%%C1 w, i+ Y2 A5 p3 ~0 g
@set /A LOWER=%LOWER%+17 {! R$ z2 B: A
rem 不需要备份,则跳转结束
2 |2 f# s+ \6 u+ Z! y; z: LIF %LOWER% gtr %UPPER% GOTO :N_EXIT
$ J6 ~1 r1 z8 p, G; f
7 D5 t: N( {% D- h) o* y- A$ O0 ~:BAKUP
# `% Q7 o  P% J; qSET FILENAME=%PROJECT%_%LOWER%_%UPPER%
% h' ?/ Y* M# u4 Y  S8 p@ECHO 开始备份项目库:%PROJECT%,生成文件=%FILENAME%0 n$ p0 Z, x1 V
%SVN_ADMIN% dump %SVN_REPOROOT%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp
- J' E' |! v- `$ \. J; Zrem %RAR_CMD% a -df %PROJECT%_%UPPER%.rar %
1 G. R1 Z/ X0 L4 b/ `1 B4 wrem 准备写备份日志信息
! K/ N' A; ?8 d; @4 s( iIF %LOWER% gtr 0 GOTO :WRITENOTE7 [9 |; O  s% ~0 A4 ^2 `
@ECHO ------2-----%date% >> %Log_PATH%\%PROJECT%_log.txt; A: Z( B' O4 @$ O; C- {, w0 c
@echo  -- 3-------添加备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt
" M4 R( X0 \/ B2 r4 m4 i1 o. K$ RGOTO :COMPLETE- T0 ?0 {) P7 d) U. q1 S4 T9 ^
  G% {3 Z/ F0 i: L
:WRITENOTE
/ ]# A( Y% V3 l+ f( c3 |$ {@ECHO %date% >> %Log_PATH%\%PROJECT%_log.txt" }6 n  k+ _: Y4 P8 v0 r
@echo  -- 4------添加增量备份文件 %PROJECT%_%UPPER%.rar,从[%LOWER%]到[%UPPER%] >> %Log_PATH%\%PROJECT%_log.txt
0 b4 [9 \; n& O3 g. B9 t: C$ k( A, B% g: o4 O6 b/ t6 N8 m: e
:COMPLETE
) n' p5 }& n" W/ C3 |rem 下面一行用于拷贝备份文件到映射的驱动器上% c1 N' U+ Z3 [' e& A7 R; h4 Q
rem copy %PROJECT%.rar %RAR_STORE%\%PROJECT%\+ f' B. D* r9 b" L( j# I$ Q
move %FILENAME%.dmp %RAR_STORE%\%PROJECT%\
) ?4 X* S  Z0 Q7 s& {# wdel %Log_PATH%\A.TMP- h7 _/ X- O' T  Z) R8 u
@echo %UPPER% > %Log_PATH%\%PROJECT%_last_revision.txt
: z) `8 ^0 ~* ^2 \4 X. [8 }1 A
5 H, n2 g" n# y" J- D, J. [; S:N_EXIT5 ~& D- S5 a/ i: E( Z' p; x% ]. l7 U, |
@echo 项目库%PROJECT%处理结束...>> %Log_PATH%\%PROJECT%_log.txt
. T$ l  s. T0 K; O: r% B  P+ g@CD..
8 q0 H% I5 v) {) a  m4 o* J@exit /B7 A' l) h, r9 l2 t6 K+ e
:no_args, P4 d( f( G; b4 H* q; h0 L- u% F
@ECHO ON
) @( \7 D* ?+ B) D9 ~: H' G, T; [@echo "正确调用方法: dump 项目库名") L3 f" K" Q. F% p
, C  k. P% K- j, l. ~8 ~; l2 y

2 M" e& ]0 E* ], R- a% ?/ K2)svndump.bat # F1 a0 V) g5 \, U' }
echo off, w4 d! z% A1 y1 L" o- ?; b
rem Subversion的安装目录及执行文件- L. Y) c. n+ o5 d4 ?) o/ g; w  @
set SVN_HOME="F:\Program Files\CollabNet Subversion Server"
$ c- b2 l* a8 N! u9 D! ?set SVN_ADMIN=%SVN_HOME%\svnadmin.exe9 j" K6 A) P: w4 P
set SVN_LOOK=%SVN_HOME%\svnlook.exe4 M6 W5 l6 a; ?9 g
rem 配置库仓库根目录' h$ ^: P4 V5 r( o$ f9 e8 J
set SVN_REPOROOT=G:\SVN8 r  T: F# \9 w' w9 ]4 M4 }
rem 压缩命令) _1 S3 i; v+ h6 |# m' s3 d9 u. I
set RAR_CMD="E:\Progra~1\WinRAR\WinRAR"' U% h/ B* [; S/ b" A4 \& N7 P  Q
rem 增量备份文件存放路径3 ~9 [; [6 E" R" r9 R% x/ S! Y
set RAR_STORE="H:\svnincrementW", M6 J7 U/ h7 u4 f8 }2 b" }
rem 日志及最后一次备份修订号存放文件目录,以下是跟增量备份脚本目录同一目录' K# _- i; p4 U! M, U
set Log_PATH=G:\backup\incrementW, ?. U  {+ O! {' h9 X% P+ h
$ R! j1 K# l2 {- ~$ p5 s
@echo 项目库%PROJECT%处理1...>> %Log_PATH%\%PROJECT%_log.txt
' K* \3 o0 T0 I2 orem 读取项目库列表文件,并忽略其中;开头的行* m1 t' ]! z2 n1 |, ~
FOR /f "eol=;" %%C IN (projectlist.conf) DO  call G:\backup\incrementW\dump.bat %%C! z  X9 K2 C" }+ o
/ E; U/ Y' l* v& G0 G' I: n5 x& l

0 S& L- [% {. x3)projectlist.conf
( @7 I" i" C# k, K  l5 o1 L;**************************************************# y6 M; I2 @4 p3 W, u6 M
;01. project1开发库2 N' V: i- |8 _, p& [2 [$ v
;    更新频率: 高
6 t% y# `5 q7 A+ D; ~3 A3 f;**************************************************
; `& _* ~) A7 ]4 U  O3 z, z- vPROJECT1# L8 O# e. l3 H( ?, O+ |0 K5 z
;**************************************************
! Z6 l& \8 a: g& ^# K;02. 此处可写注释信息
: v4 y( |4 |6 n1 |+ f1 G$ F3 n& P;**************************************************
% u4 |1 P5 H4 KPROJECT2
; @& F# ^; i$ }: q5 }# O8 hPROJECT38 h+ z- H1 k$ D0 P
PROJECT48 V! b: ?* I" C( ^2 C" M* Z
PROJECT5
4 U; k# V$ g) a8 [' T1 W. y- t8 {1 W1 f- m7 a* c  H- N7 Y
[ 本帖最后由 千寻 于 2008-12-23 14:26 编辑 ]

本帖子中包含更多资源

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

x

评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

回复 楼主 的帖子

感谢千寻千大人分享关于SVN自动备份的脚本;/ ^! M4 A3 w/ R, g( @
大家的福音啊!!!
回复 支持 反对

使用道具 举报

发表于 2008-12-24 11:18:08 | 显示全部楼层
感谢版主分享~; A9 M/ {; _; V3 ^
呵呵
' i" q9 o0 `% x7 G- B分享 互助 共进~
回复 支持 反对

使用道具 举报

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

有没有分段备份的!

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

使用道具 举报

发表于 2008-12-24 13:09:51 | 显示全部楼层
可以选择备份一部分+ b8 }; J% K& z
部分版本即可
回复 支持 反对

使用道具 举报

发表于 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,你这个增量备份的脚本如何使用 ? 能给个说明吗?
& n. C) C1 `4 V$ @$ J还有完全备份的脚本,我用了,目标备份目录如果不是空的话,执行脚本会报错,并不会去删除....
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

SCMLife推荐上一条 /1 下一条

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

GMT+8, 2022-8-18 18:46 , Processed in 0.077729 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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