SVN存储库备份策略


Answers:


179

您可以使用类似(Linux)的方法:

svnadmin dump repositorypath | gzip > backupname.svn.gz

由于Windows不支持GZip,因此:

svnadmin dump repositorypath > backupname.svn

11
我不确定,但可以肯定的是,诸如7-zip之类的某些工具将能够从STDIN压缩数据,这意味着您也可以在Windows上使用第一种样式。
尼克

5
我只是自己看这个,文档svnbook.red-bean.com/nightly/en/…中的一条评论是,除非使用--deltas选项,否则您将获得很大的svnadmin dump输出。
杰森S

5
和Windows不支持gzip,刚刚从unxutils得到它的网页unxutils.sourceforge.net
贾森小号

52
使用7Zip: svnadmin dump repositorypath | "%ProgramFiles%\7-Zip\7z.exe" a backup.7z -sibackupname.svn 这将创建一个名为“ backup.7z”的文件,其中包含一个文件“ backupname.svn”,该文件是的输出svnadmin dump
马特2010年

4
@Josh Stodola bashfor project in *; do svnadmin dump ${project} | gzip > /backuppath/${project}.svn.gz; done;
Fedir RYKHTIK 2011年

107

我们使用svnadmin hotcopy,例如:

svnadmin hotcopy C:\svn\repo D:\backups\svn\repo

根据这本书

您可以随时运行此命令并为存储库创建安全副本,而不管其他进程是否在使用该存储库。

您当然可以ZIP(最好是7-Zip)备份副本。恕我直言,这是最简单的备份选项:万一发生灾难,除了将其解压缩到位之外,别无他法。


13
我认为svnadmin dump是备份的首选,这有两个原因。参见svn.haxx.se/users/archive-2005-05/0842.shtml
daremon

4
@daremon:我建议您阅读对链接到的帖子的回复,特别是提到svnadmin dump的帖子不包括回购的控制文件。
Powerlord

接近种族,但是,我在阅读了R.
Bemrose

hotcopy命令不会覆盖或增加其生成的备份。因此,如果您打算使用任务计划程序在Windows中将其自动化,请查看以下批处理文件:cfchimp.com/wordpress/2008/05/…–
Ryan Sampson

1
一句话警告。在svnsync运行时,请勿热拷贝存储库的svnsync镜像副本!结果副本可能已损坏。有关详细信息
请参见此


22

这是一个Perl脚本,它将:

  1. 备份仓库
  2. 通过SCP将其复制到另一台服务器
  3. 取回备份
  4. 从备份创建测试库
  5. 做一个测试结帐
  6. 给您发任何错误的电子邮件(通过cron)

剧本:

my $svn_repo = "/var/svn";  
my $bkup_dir = "/home/backup_user/backups";
my $bkup_file = "my_backup-";
my $tmp_dir = "/home/backup_user/tmp";   
my $bkup_svr = "my.backup.com";
my $bkup_svr_login = "backup";

$bkup_file = $bkup_file . `date +%Y%m%d-%H%M`;
chomp $bkup_file;
my $youngest = `svnlook youngest $svn_repo`;
chomp $youngest;

my $dump_command = "svnadmin  -q dump $svn_repo > $bkup_dir/$bkup_file ";
print "\nDumping Subversion repo $svn_repo to $bkup_file...\n";
print `$dump_command`;
print "Backing up through revision $youngest... \n";
print "\nCompressing dump file...\n";
print `gzip -9 $bkup_dir/$bkup_file\n`;
chomp $bkup_file;
my $zipped_file = $bkup_dir . "/" . $bkup_file . ".gz";
print "\nCreated $zipped_file\n";
print `scp $zipped_file $bkup_svr_login\@$bkup_svr:/home/backup/`;
print "\n$bkup_file.gz transfered to $bkup_svr\n";

#Test Backup
print "\n---------------------------------------\n";
print "Testing Backup";
print "\n---------------------------------------\n";
print "Downloading $bkup_file.gz from $bkup_svr\n";
print `scp $bkup_svr_login\@$bkup_svr:/home/backup/$bkup_file.gz $tmp_dir/`;
print "Unzipping $bkup_file.gz\n";
print `gunzip $tmp_dir/$bkup_file.gz`;
print "Creating test repository\n";
print `svnadmin create $tmp_dir/test_repo`;
print "Loading repository\n";
print `svnadmin -q load $tmp_dir/test_repo < $tmp_dir/$bkup_file`;
print "Checking out repository\n";
print `svn -q co file://$tmp_dir/test_repo $tmp_dir/test_checkout`;
print "Cleaning up\n";
print `rm -f $tmp_dir/$bkup_file`;
print `rm -rf $tmp_dir/test_checkout`;
print `rm -rf $tmp_dir/test_repo`;

脚本源以及有关此类备份原理的更多详细信息。


19

我使用svnsync,它将远程服务器设置为镜像/从服务器。两周前,我们有一台服务器宕机了,我能够轻松地将从服务器切换到主要位置(只需要将从服务器存储库上的UUID重置为原始服务器)。

另一个好处是,同步可以由中间人来运行,而不是作为任一服务器上的任务来运行。我有一个客户端,可以在两个VPN之间同步存储库。


所以它显然在两者之间同步了最新的回购版本?
PositiveGuy 2009年

1
即使它在标题中,我也不知道我会称其为“同步”。它实际上是一个备份,它将在主服务器上进行修订,然后将其放在从服务器上。如果您在从属服务器上进行了修改,则它们可能会破坏“同步”或导致疯狂。该工具的预期用途是创建异地只读镜像,但在创建备份服务器方面做得非常好。
汤姆·梅菲尔德,

1
svnsync的好处是您可以经常运行它。每十分钟甚至每一次提交(使用钩子)。这样的好处是可以减少潜在的数据丢失,否则您可能会在上一次备份到实时回购丢失之间发生数据丢失。
8DH,

12

svnadmin hotcopy

svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH

此子命令对存储库进行完整的“热”备份,包括所有挂钩,配置文件,当然还有数据库文件。




5

基本上,如果svn服务器已停止,则复制存储库文件夹是安全的。(来源:https : //groups.google.com/forum/?fromgroups#!topic/visualsvn/i_55khUBrys%5B1-25%5D

因此,如果允许您停止服务器,请执行该操作,然后仅使用某些脚本或备份工具复制存储库。Cobian Backup非常适合此处,因为它可以自动停止和启动服务,并且可以执行增量备份,因此您仅备份最近更改的存储库部分(如果存储库很大且要备份到远程位置,则很有用)。

例:

  1. 安装Cobian备份
  2. 添加备份任务:

    • 将源设置为存储库文件夹(例如C:\Repositories\),

    • 添加备份前事件"STOP_SERVICE"VisualSVN,

    • 添加备份后事件,"START_SERVICE"VisualSVN,

    • 根据需要设置其他选项。我们已经设置了增量备份,包括删除旧备份,备份计划,目标,压缩等。档案分割等

  3. 利润!


4

有两种主要的方法来备份svn服务器,首先是hotcopy,它将创建存储库文件的副本,这种方法的主要问题是它会保存有关基础文件系统的数据,因此尝试重新存储可能会遇到一些困难另一种svn服务器类型或另一台计算机上的这种备份。还有另一种称为转储的备份,该备份不会保存基础文件系统的任何信息,并且不会存储到任何基于tigiris.org subversion的SVN服务器中。

关于备份工具,您可以从命令提示符下使用svnadmin工具(它可以进行热复制和转储),此控制台位于svn服务器所在的目录中,或者您可以在Google上搜索svn备份工具。

我的建议是您同时进行两种备份,并将它们从办公室移出到您的电子邮件帐户,亚马逊s3服务,ftp或azure服务,这样您将获得安全的备份,而不必将svn服务器托管在其他地方你的办公室。


4

这里是一个GUI Windows工具,用于转储本地和远程Subversion存储库:

https://falsinsoft-software.blogspot.com/p/svn-backup-tool.html

工具说明如下:

这个简单的工具允许对本地和远程Subversion存储库进行转储备份。该软件的工作方式与“ svnadmin”相同,但不是其GUI前端。而是直接使用Subversion库,以允许在独立模式下创建转储而无需任何其他工具。

希望这个帮助...


感谢您分享此内容,并完全按照说明进行操作。
Ed DeGagne

3

我只想将整个repo目录复制到我的备份位置。这样,如果发生什么情况,您可以将目录复制回去并准备立即进行。

只需确保保留权限(如果需要)。通常,这仅是Linux计算机上的一个问题。


7
如果有人在复制操作期间进行提交,这并不是完全安全的-即使只有4个人访问该存储库并很少使用它,我也遇到过这种情况。请参阅Duncan关于使用hotcopy的答案。
尼克

但是,如果您是完全单独工作,那么我认为这是备份存储库的安全方法吗?我在个人项目中使用subversion,这就是我目前正在做的事情。
Andrew Garrison

3

对于托管存储库,您可以从svn 1.7版开始使用svnrdump,类似于svnadmin dump本地存储库。该文章提供了一个很好的步行通过,基本上可以归结为:

svnrdump dump /URL/to/remote/repository > myRepository.dump

下载转储文件后,可以将其本地导入

svnadmin load /path/to/local/repository < myRepository.dump

或将其上传到您选择的主机。


3

如果使用的是FSFS存储库格式(默认),则可以复制存储库本身以进行备份。对于较旧的BerkleyDB系统,存储库不是独立于平台的,因此通常需要使用svnadmin dump。

有关备份svnbook文档主题建议使用此svnadmin hotcopy命令,因为它将处理诸如文件使用等问题。


2
@echo off
set hour=%time:~0,2%
if "%hour:~0,1%"==" " set hour=0%time:~1,1%
set folder=%date:~6,4%%date:~3,2%%date:~0,2%%hour%%time:~3,2%

echo Performing Backup
md "\\HOME\Development\Backups\SubVersion\%folder%"

svnadmin dump "C:\Users\Yakyb\Desktop\MainRepositary\Jake" | "C:\Program Files\7-Zip\7z.exe" a "\\HOME\Development\Backups\SubVersion\%folder%\Jake.7z" -sibackupname.svn

这是我正在运行的用于执行备份的批处理文件



1

我已经按照我的步骤进行了编译,目的是备份项目的远程SVN存储库。

install svk (http://svk.bestpractical.com/view/SVKWin32)

install svn (http://sourceforge.net/projects/win32svn/files/1.6.16/Setup-Subversion-1.6.16.msi/download)

svk mirror //local <remote repository URL>

svk sync //local

这需要时间,并表示它正在从存储库中获取日志。它在内部创建了一组文件C:\Documents and Settings\nverma\.svk\local

要使用来自远程数据库的最新更改集更新此本地存储库,只需不时运行前面的命令。

现在,您可以/home/user/.svk/local像使用普通的SVN存储库一样使用本地存储库(在本示例中)!

这种方法的唯一问题是,本地存储库是通过远程存储库中的实际修订版以修订版增量创建的。正如某人写道:

svk miror命令在刚刚创建的存储库中生成提交。因此,与远程公共存储库相比,后续同步创建的所有提交的修订版本号都将增加一。

但是,这对我来说还可以,因为我只想不时备份远程存储库,别无其他。

验证:

要进行验证,请将SVN客户端与本地存储库一起使用,如下所示:

svn checkout "file:///C:/Documents and Settings\nverma/.svk/local/"  <local-dir-path-to-checkout-onto>

然后,该命令将从本地存储库签出最新修订版。最后说Checked out revision N。这N比在远程存储库中找到的实际修订版本要多(由于上述问题)。

为了验证svk是否也带来了所有历史记录,在SVN签出中使用-r了2、10、50等各种旧版本进行了运行。然后<local-dir-path-to-checkout-onto>确认文件来自该版本。

最后,压缩目录C:/Documents and Settings\nverma/.svk/local/并将其存储在某处。继续定期这样做。


0

正如其他人所说,Subversion团队的hot-backup.py具有一些不错的功能,而不仅仅是普通的 svnadmin hotcopy

我在python脚本上运行了计划任务,该脚本在机器上的所有存储库中搜寻了蜘蛛,并使用hotbackup保留了几天的热拷贝(损坏的妄想症)和svnadmin svndump远程机器。到目前为止,恢复确实很容易。


0

1.1从SVN(Subversion)存储库创建转储

svnadmin dump /path/to/reponame > /path/to/reponame.dump

真实的例子

svnadmin dump /var/www/svn/testrepo > /backups/testrepo.dump

1.2 Gzip创建的转储

gzip -9 /path/to/reponame.dump

真实的例子

gzip -9 /backups/testrepo.dump

1.3带有单线的SVN转储和Gzip转储

svnadmin dump /path/to/reponame | gzip -9 > /path/to/reponame.dump.gz

真实的例子

svnadmin dump /var/www/svn/testrepo |Â gzip -9 > /backups/testrepo.dump.gz

如何在Linux上备份(转储)和还原(加载)SVN(Subversion)存储库。
参考: SVN Subversion备份和还原

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.