SVN存储库备份策略

我是SVN的新手,我想知道有什么方法可以在Windows环境中备份存储库?

144404 次浏览

我喜欢将整个repo目录复制到我的备份位置。这样,如果发生了什么事情,您只需将目录复制回来,就可以立即使用。

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

您可以使用类似(Linux):

svnadmin dump repositorypath | gzip > backupname.svn.gz

因为Windows不支持gzip,所以它只是:

svnadmin dump repositorypath > backupname.svn
SVNBook中的

详细参考: “使用svnadmin进行存储库数据迁移”

svnadmin热拷贝

svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH

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

Subversion网站上提供了一个hotbackup.py脚本,它对于自动备份非常方便。

http://svn.apache.org/repos/asf/subversion/trunk/tools/backup/hot-backup.py.in.

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

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

我们使用svnadmin hotcopy,例如:

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

根据那本书

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

当然,您可以压缩(最好是7-zip)备份副本。恕我直言,这是最直接的备份选项:在发生灾难的情况下,除了将其解压回原位外,几乎没有什么可做的。

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

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

正如其他人所说的,Subversion团队的hot-backup.py与普通的svnadmin hotcopy相比,有一些很好的特性。

我在Python脚本上运行一个计划任务,该脚本搜索计算机上的所有存储库,并使用热备份在远程计算机上保存几天的热拷贝(担心损坏)和svnadmin svndump。到目前为止,修复真的很容易。

下面是一个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`;

脚本源文件和有关此类型备份的更多详细信息。

对于每日备份和完全备份解决方案,只需使用此处的SVN备份脚本

Google Code上的SVN备份,一个.NET控制台应用程序。

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

关于备份工具,您可以从命令提示符使用svnadmin工具(它能够执行热复制和转储),此控制台驻留在您的SVN服务器所在的同一目录中,或者您可以搜索SVN备份工具。

我的建议是,您可以执行这两种备份,并将它们从办公室转移到您的电子邮件帐户、Amazon S3服务、FTP或Azure服务,这样您就可以进行安全备份,而不必在办公室以外的某个地方托管SVN服务器。

为了备份远程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中创建一组文件。

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

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

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

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

但是,这对我来说是可以的,因为我只想不时地对远程存储库进行一些备份,而不是其他。

验证:

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

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

然后,此命令将从本地存储库中签出最新修订。最后写着Checked out revision N。这个N比在远程存储库中找到的实际修订多一个(由于上面提到的问题)。

为了验证SVK也带来了所有的历史记录,使用-r(2、10、50等)以各种较旧的版本运行SVN检验。则确认<local-dir-path-to-checkout-onto>中的文件来自该版本。

最后,压缩目录__abc0,并将压缩文件存储在某个位置。经常这样做。

@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

这是我运行的执行备份的批处理文件

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

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

示例:

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

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

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

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

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

  3. 利润!

对于托管存储库,您可以从SVN版本1.7开始使用svnrdump,它类似于本地存储库的svnadmin dump。这个文章提供了一个很好的演练,本质上可以归结为:

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

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

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

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

下面是一个GUI窗口工具,用于对本地和远程Subversion存储库进行转储:

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

工具说明中说:

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

希望对你有帮助..

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备份与恢复