SVN仓库备份策略

197

在Windows环境下备份存储库的可用方法有哪些?


1
VisualSVN Server for Windows 包含一个内置功能,可以按计划备份和验证 SVN 存储库:https://www.visualsvn.com/server/features/backup/ - bahrep
19个回答

181
你可以使用类似于以下的方式(在 Linux 平台上):

svnadmin dump repositorypath | gzip > backupname.svn.gz

由于Windows不支持GZip,所以只能:

svnadmin dump repositorypath > backupname.svn

11
我不确定,但是像7-zip这样的工具肯定可以压缩来自STDIN的数据,这意味着您也可以在Windows上使用第一种方法。 - nickf
5
我只是在自己看这个,文档中有一个评论 http://svnbook.red-bean.com/nightly/en/svn.reposadmin.maint.html#svn.reposadmin.maint.backup 提到,除非使用 --deltas 选项,否则您将获得非常大的 svnadmin dump 输出。 - Jason S
5
Windows 支持 gzip,只需从 unxutils 网页 http://unxutils.sourceforge.net/ 下载即可。 - Jason S
52
使用7Zip:svnadmin dump repositorypath | "%ProgramFiles%\7-Zip\7z.exe" a backup.7z -sibackupname.svn这将创建一个名为“backup.7z”的文件,其中包含一个名为“backupname.svn”的单个文件,该文件是从svnadmin dump获得的输出。 - Matt
4
@Josh Stodola bash: for project in *; do svnadmin dump ${project} | gzip > /backuppath/${project}.svn.gz; done;这段代码的意思是:对于当前目录下的每个项目,先使用svnadmin命令将其备份,并将备份数据通过gzip进行压缩,最后将压缩的结果存储到指定路径下以该项目名为文件名的文件中。 - Fedir RYKHTIK
显示剩余7条评论

107
我们使用svnadmin hotcopy命令进行备份,例如:

svnadmin hotcopy /path/to/repository /path/to/backup

svnadmin hotcopy C:\svn\repo D:\backups\svn\repo
根据该书的描述:
您可以随时运行此命令,并制作存储库的安全副本,而不管其他进程是否正在使用该存储库。
当然,您可以将备份文件复制为ZIP文件(最好是7-Zip)。在灾难发生时,解压缩回到原位就可以了。

13
我认为svnadmin dump备份有几个优点。请参见http://svn.haxx.se/users/archive-2005-05/0842.shtml。 - daremon
4
我建议你阅读你所链接的帖子中的回复,特别是提到svnadmin dump不包括仓库控制文件的那个回复。 - Powerlord
胶着的竞争,但是在阅读了R. Bemrose提出的回复后,我会投票给svnadmin dump。 - mobibob
hotcopy命令不会覆盖或增量生成的备份。因此,如果您计划在Windows中使用任务计划程序自动化它,请查看以下批处理文件:http://www.cfchimp.com/wordpress/2008/05/subversion-backup-of-multiple-repositories-via-dos-bat-file/ - Ryan Sampson
1
警告:在svnsync正在运行时,请勿热拷贝存储库的svnsync镜像副本!生成的副本可能会损坏。有关详细信息,请参见此线程:http://subversion.open.collab.net/ds/viewMessage.do?dsForumId=3&dsMessageId=437673 - Andriy Volkov

24

7
我相信这是一个有效的链接,可以用于热备份脚本:http://svn.apache.org/repos/asf/subversion/trunk/tools/backup/hot-backup.py.in - Carvell Fenton

22

这里有一个Perl脚本,可以:

  1. 备份repo
  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

我使用SVN同步,它可以将远程服务器设置为镜像/从属。两周前我们的服务器出了问题,但我很容易地将从属服务器切换到主要位置(只需将从属库的UUID重置为原始值)。

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


那么它会在两个显然之间同步最新的仓库版本? - PositiveGuy
1
尽管标题中有这个词,但我不认为它应该被称为“同步”。它实际上是一个备份工具,可以将主服务器上的修订版本复制到从服务器上。如果您在从服务器上进行了修改,它们要么会破坏“同步”,要么会导致混乱。该工具的预期用途是创建离线、只读的镜像,但它也能很好地创建备份服务器。 - Tom Mayfield
1
svnsync的好处在于您可以经常运行它。每十分钟甚至在每次提交时(使用钩子)。这样做的好处是可以减少潜在的数据丢失,否则您将在上次备份和实时仓库丢失之间遇到数据丢失。 - 8DH

12

svnadmin hotcopy

svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH

这个子命令会进行完整的“热备份”,包括所有的钩子、配置文件和当然,数据库文件。


10

svnbackup是一个在Google Code上发布的.NET控制台应用程序。


10

5
基本上,如果停止svn服务器,则可以安全地复制存储库文件夹。(来源:https://groups.google.com/forum/?fromgroups#!topic/visualsvn/i_55khUBrys%5B1-25%5D)
因此,如果允许停止服务器,请停止服务器并复制存储库,可以使用脚本或备份工具。Cobian Backup非常适合此处,它可以自动停止和启动服务,并且可以执行增量备份,因此您只需备份最近更改的存储库部分(如果存储库很大并且您正在将其备份到远程位置,则非常有用)。
示例:
1. 安装Cobian Backup 2. 添加备份任务: * 将源设置为存储库文件夹(例如C:\Repositories\), * 添加预备份事件"STOP_SERVICE" VisualSVN, * 添加后备份事件"START_SERVICE" VisualSVN, * 根据需要设置其他选项。我们设置了增量备份,包括删除旧备份、备份计划、目标、压缩包拆分等。 3. 受益!

4
有两种主要方法来备份 svn 服务器,第一种是 hotcopy,它将创建您的存储库文件的副本。这种方法的主要问题是它保存了有关底层文件系统的数据,因此您可能会在尝试在另一个相似类型或另一台机器上重新存储此类备份时遇到一些困难。还有一种称为 dump 的备份类型,此备份不会保存有关底层文件系统的任何信息,并且可移植到基于 tigiris.org subversion 的任何类型的 SVN 服务器。

关于备份工具,您可以使用命令提示符中的 svnadmin 工具(它可以执行 hotcopy 和 dump),此控制台位于您的 svn 服务器所在的同一目录中,或者您可以搜索 svn 备份工具。

我的建议是您同时执行这两种备份,并将它们转移到电子邮件帐户、Amazon S3 服务、FTP 或 Azure 服务中,这样您就可以获得安全备份,而无需在办公室外托管 svn 服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接