pengpenglin
人,必须选择一种生活方式并有勇气坚持下去
BlogJava
首页
新随笔
新文章
联系
聚合
管理
posts - 262, comments - 221, trackbacks - 0
【版本控制之路】版本库的备份
【1.业务需求】
作为开发人员,最大的噩梦莫过于自己辛辛苦苦开发的程序由于各种原因而丢失了。所以定期备份资料乃是开发人员的一大美德(我自己重要的资料备份了4份,分别放在不同的地方)。SVN作为代码和文档汇聚之地,定期备份的重要性更是不容置疑。
【2.基本思路】
通常我们备份的方式无非有:完全备份和增量备份两种。完全备份适用于版本库的大小比较小的情况,对于版本库比较大或者已经存在版本库的情况下,则没有必要也不可能使用完全备份了。这时增量备份就是一个很好的选择。
除了完全备份和增量备份,我们还有另外一种方式:版本库同步。这种方法可以在源版本库和目标版本库之间做同步(通常是单向的)。一旦源版本库发生了改变则可以马上通知目标版本库做出相同的改变。
注意:版本库的备份不能简单地使用copy-paste的方法来拷贝复杂版本库的db目录,否则有可能出现数据不完全的情况。
所以我们的备份策略是:
①首次备份采用完全备份,后续备份采用增量备份和版本库同步
②完全备份在晚上定时进行,增量备份和版本库同步在用户提交时进行
注意:这个策略实际上是有较大问题的(包括备份的方式,频度,时间):通常完全备份会在每周,月进行一次。而增量备份会,版本库同步会在每天晚上定时执行,而不是在每次用户提交后执行,以缩短请求响应。但这里因为本着简单的原则,只是抽取了最简单的策略
【3.相关命令】
SVN用于备份的命令有以下三个,分别对应于完全备份,增量备份,版本库同步。
①svnadmin hotcopy
②svnadmin dump [--incremental]
③svnsync init|sync
关于这三个命令的具体用法,请大家自行参考SVN的用户手册以获得更多资讯。
【4.示例操作】
注:本示例代码均为网上下载,非本人原创。
Example 1:完全备份
fullbackup.bat
@echo off
@echo 不同的系统平台和时间格式设置会影响目录的创建,请先用echo命令输出日期格式并做相应调整
rem
Subversion的安装目录
set
SVN_HOME
=
C:
\
Develop
\
Subversion
rem
所有版本库的父目录
set
SVN_ROOT
=
C:
\
Develop
\
svntest
\
testRepos
rem
备份的根目录
set
BACKUP_SVN_ROOT
=
C:
\
Develop
\
svntest
\
svnbackup
\
full
rem
每次备份的子目录
set
BACKUP_DIRECTORY
=
%BACKUP_SVN_ROOT%
\
%
date
:~
4
,
14
%
rem
如果备份的子目录不存在则先创建
if
exist %BACKUP_DIRECTORY%
goto
checkBack
echo 建立备份目录%BACKUP_DIRECTORY%
>>
%BACKUP_SVN_ROOT%
/
backup.log
mkdir %BACKUP_DIRECTORY%
rem
验证目录是否为版本库,如果是则取出名称备份
for
/
r %SVN_ROOT% %%I in (.)
do
@
if
exist
"
%%I\conf\svnserve.conf
"
%SVN_ROOT%
\
dofullBackup.bat
"
%%~fI
"
%%~nI
goto
end
:checkBack
echo 备份目录%BACKUP_DIRECTORY%已经存在,请清空。
goto
end
:
end
dofullbackup.bat
@echo 正在备份版本库%
1
@%SVN_HOME%
\
bin
\
svnadmin hotcopy
%
1
%BACKUP_DIRECTORY%
\
%
2
@echo 版本库%1成功备份到了%
2
!
由于批处理文件中%date命令的输出格式受平台的控制(实际上是控制面板中的时区设置)影响,所以对于文件中使用到date函数的地方,读者要特别注意。需要首先在DOS下确认日期输出格式,然后根据实际情况进行截取。
将这两个文件放在repository的同级目录下,执行之则可以。读者可以自行修改上面的环境变量设置
Example 2:增量备份
post-commit.bat
echo off
set
SVN_HOME
=
C:
\
Develop
\
Subversion
set
SVN_ROOT
=
C:
\
Develop
\
svntest
\
testRepos
set
UNIX_SVN_ROOT
=
C:
/
Develop
/
svntest
/
testRepos
set
DELTA_BACKUP_SVN_ROOT
=
C:
\
Develop
\
svntest
\
svnbackup
\
delta
set
LOG_FILE
=
%DELTA_BACKUP_SVN_ROOT%
\
backup.log
@echo 不同的系统平台和时间格式设置会影响目录的创建,请先用echo命令输出日期格式并做相应调整
rem
版本库增量导出
for
/
r %SVN_ROOT% %%I in (.)
do
if
%UNIX_SVN_ROOT%
/
%%~nI
==
%
1
echo 备份开始 版本路径:%SVN_ROOT%
\
%%~nI 版本号:%
2
>>
%LOG_FILE% | %SVN_ROOT%
\
%%~nI
\
hooks
\
deltaBackup.bat %%~nI %
2
goto
end
:
end
这个批处理文件的重点在于%UNIX_SVN_ROOT%/%%~nI == %1这句话。它的作用是判断当前提交的目标版本库是不是和循环中的变量值相同,如果是那么认为该修改是提交到这个版本库的,就可以进行增量备份了。我在运行这个文件时,一开始老是失败,后来发现原因居然是路径的写法问题。
请注意UNIX_SVN_ROOT这个变量的路径值写法,如果你换成SVN_ROOT看看,肯定是不会成功的。因为路径的写法不同!
deltaBackup.bat
@echo 正在备份版本库%
2
@%SVN_HOME%
\
bin
\
svnadmin dump %SVN_ROOT%
\
%
1
--
incremental
--
revision
%
2
>>
%DELTA_BACKUP_SVN_ROOT%
\
%
1
-
%
date
:~
4
,
14
%.dump
@echo 版本库%2成功备份到了%
3
!
这个文件里面特别要注意的就是--incremental这个参数,如果你不加上去的话以后再执行load就会提示版本库已经存在的错误了!而--revision则用于指定备份的版本。
将以上两个文件放置在repository的hooks目录下即可。
Example 3:版本库同步
首先创建一个版本库用于同步(目标版本库),其次要在源版本库和目标版本库之间建立联系。这是通过svnsync init来达到的。
svnsync init 目标库URL 源库URL
这个命令执行过程中可能需要增加两个参数--username和--password用于指明目标版本库的用户名和密码。
其次在目标版本库的hooks目录下建立一个
空的文件
并命名为pre-revprop-change.bat。这一步很重要,否则会出现鉴权失败的错误。最后就是在源版本库的hooks目录下建立一个名为post-commit.bat的文件,如下所示:
echo off
rem
版本库同步
%SVN_HOME%
\
bin
\
svnsync sync
--
non
-
interactive
svn:
//
localhost
/
newRepo_backup
但用户在源版本库执行了相应的修改动作之后,你会发现目标版本库也出现了同样的修改!
附件:
完整测试目录及脚本文件
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2008-12-30 17:35
Paul Lin
阅读(2479)
评论(5)
编辑
收藏
所属分类:
项目管理
FeedBack:
#
re: 【版本控制之路】版本库的备份
2008-12-30 19:04 |
激情
just test!!!
回复
更多评论
#
re: 【版本控制之路】版本库的备份
2008-12-31 20:00 |
梦想在这里起飞
写得不错啊,看看我这个
开源的报表ireport项目web应用
http://ireport.cubebi.com
回复
更多评论
#
re: 【版本控制之路】版本库的备份[未登录]
2009-01-01 11:01 |
Paul Lin
@梦想在这里起飞
支持国产软件,很不错!
回复
更多评论
#
re: 【版本控制之路】版本库的备份
2009-01-02 11:43 |
爱吃鱼头
svn很重要!备份很重要!向lz学习了!
回复
更多评论
#
re: 【版本控制之路】版本库的备份
2010-03-30 11:01 |
醉月茶
很好,拜读了~
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
【转】有没有可能进行同级管理
敏捷文章三则
【原】敏捷开发沉思(真实对话)
【转】新任项目经理必须掌握的五项修炼
【转】管理者的困境:放权或者崩溃
【转】网络阅读,为什么人会浮躁?
【原】SVN In Action系列发布
【原】SVN In Action(23)
【原】SVN In Action(22)
【原】SVN In Action(21)
<
2008年12月
>
日
一
二
三
四
五
六
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(21)
给我留言
查看公开留言
查看私人留言
随笔分类
J2EE 框架(9)
J2EE基础(4)
J2SE(43)
Java 工具(5)
Oracle Concept(4)
Oracle SQL/PLSQL(9)
Oracle 开发(13)
Oracle 管理(4)
Oracle 调优
Oracle 错误诊断
RoR(19)
UML(3)
Unix / Linux(13)
Web基础(19)
其它技术(7)
感悟(3)
杂项(7)
架构与性能(8)
模式与重构(19)
灌水(8)
电影与音乐(16)
走过的路(1)
软件过程与软件方法(3)
阳光户外(2)
项目管理(36)
随笔档案
2012年2月 (3)
2011年11月 (4)
2011年10月 (1)
2011年9月 (2)
2011年8月 (2)
2011年7月 (5)
2011年6月 (3)
2011年5月 (1)
2011年4月 (1)
2011年3月 (3)
2011年1月 (1)
2010年12月 (1)
2010年11月 (5)
2010年10月 (3)
2010年9月 (1)
2010年7月 (1)
2010年6月 (1)
2010年5月 (4)
2010年4月 (9)
2010年3月 (19)
2010年2月 (8)
2010年1月 (3)
2009年12月 (34)
2009年11月 (1)
2009年10月 (2)
2009年7月 (4)
2009年6月 (5)
2009年5月 (3)
2009年4月 (2)
2009年3月 (1)
2009年2月 (5)
2009年1月 (5)
2008年12月 (13)
2008年11月 (4)
2008年10月 (1)
2008年9月 (6)
2008年8月 (5)
2008年7月 (3)
2008年6月 (31)
2008年5月 (10)
2008年4月 (9)
2008年3月 (7)
2008年2月 (4)
2008年1月 (19)
BlogJava热点博客
BeanSoft
Jack.Wang
如坐春风
诗特林
郑晖
银河使者
阿密果
隔叶黄莺
好友博客
无羽苍鹰
搜索
最新评论
1. re: 【Java基础专题】编码与乱码(01)---编码基础[未登录]
666666666666666666666这几天正在做个类似工程编码出现错误
--李
2. re: 【Java基础专题】IO与文件读写---使用Apache commons IO简化文件读写
不错
--阿斯兰
3. re: 【Java基础专题】编码与乱码(03)----String的toCharArray()方法
多谢分享
--thx
4. re: 【Java基础专题】编码与乱码(05)---GBK与UTF-8之间的转换
评论内容较长,点击标题查看
--karl
5. re: 【Java基础专题】编码与乱码(01)---编码基础[未登录]
谢谢,帮了我大忙!
--小龙
阅读排行榜
1. Oracle中如何插入特殊字符:& 和 ' (多种解决方案)(48373)
2. getOutputStream() has already been called for this response的解决方法(43328)
3. 【Java基础专题】编码与乱码(05)---GBK与UTF-8之间的转换(36966)
4. 360安全卫士误删audiosrv.dll文件造成系统无声的解决方案(21211)
5. Java中读取字节流并按指定编码转换成字符串的方法(17301)
评论排行榜
1. 360安全卫士误删audiosrv.dll文件造成系统无声的解决方案(33)
2. 【原】Oracle开发专题之:时间运算(11)
3. 【Java基础专题】编码与乱码(05)---GBK与UTF-8之间的转换(11)
4. getOutputStream() has already been called for this response的解决方法(10)
5. 【原】Oracle开发专题之:分析函数(OVER)(8)