SVN 仓库备份策略
Posted
技术标签:
【中文标题】SVN 仓库备份策略【英文标题】:SVN repository backup strategies 【发布时间】:2010-09-07 04:16:28 【问题描述】:我是 SVN 新手,我想知道在 Windows 环境中备份存储库的方法有哪些?
【问题讨论】:
VisualSVN Server for Windows 包含一个内置功能,可按时备份和验证 SVN 存储库:visualsvn.com/server/features/backup 【参考方案1】:你可以使用类似(Linux)的东西:
svnadmin dump repositorypath | gzip > backupname.svn.gz
由于 Windows 不支持 GZip,它只是:
svnadmin dump repositorypath > backupname.svn
【讨论】:
我不确定,但像 7-zip 这样的工具肯定能够压缩来自 STDIN 的数据,这意味着您也可以在 Windows 上使用第一种样式。 我自己只是在看这个,来自文档svnbook.red-bean.com/nightly/en/… 的一条评论是,除非您使用 --deltas 选项,否则您将获得非常大的 svnadmin 转储输出。跨度> 而且Windows确实支持gzip,从unxutils网页unxutils.sourceforge.net获取即可 使用 7Zip:svnadmin dump repositorypath | "%ProgramFiles%\7-Zip\7z.exe" a backup.7z -sibackupname.svn
这将创建一个名为“backup.7z”的文件,其中包含一个文件“backupname.svn”,它是svnadmin dump
的输出。
@Josh Stodola bash : for project in *; do svnadmin dump $project | gzip > /backuppath/$project.svn.gz; done;
【参考方案2】:
我们使用svnadmin hotcopy,例如:
svnadmin hotcopy C:\svn\repo D:\backups\svn\repo
根据the book:
您可以随时运行此命令并制作存储库的安全副本,无论其他进程是否正在使用该存储库。
您当然可以压缩(最好是 7-Zip)备份副本。恕我直言,这是最直接的备份选项:万一发生灾难,除了将其解压缩回原位外,别无他法。
【讨论】:
我认为 svnadmin 转储是备份的首选,原因有几个。见svn.haxx.se/users/archive-2005-05/0842.shtml @daremon:我建议您阅读对您链接到的帖子的回复,特别是提到 svnadmin dump 的帖子不包含 repo 的控制文件。 势均力敌,但是,在阅读了 R. Bemrose 建议的回复后,我投票支持 svnadmin dump hotcopy 命令不会覆盖或增加它生成的备份。因此,如果您打算使用任务计划程序在 Windows 中自动化它,请查看以下批处理文件:cfchimp.com/wordpress/2008/05/… 一句警告。不要在 svnsync 运行时热复制 svnsync 的镜像副本!生成的副本可能已损坏。详情见本帖:subversion.open.collab.net/ds/…【参考方案3】:Subversion 网站上有一个 hotbackup.py 脚本,它非常方便自动备份。
http://svn.apache.org/repos/asf/subversion/trunk/tools/backup/hot-backup.py.in
【讨论】:
我相信这是一个适用于热备份脚本的链接:svn.apache.org/repos/asf/subversion/trunk/tools/backup/…【参考方案4】:这是一个 Perl 脚本,它将:
-
备份存储库
通过 SCP 将其复制到另一台服务器
检索备份
从备份创建测试存储库
进行测试结帐
通过电子邮件向您发送任何错误(通过 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`;
Script source and more details about the rational for this type of backup.
【讨论】:
【参考方案5】:我使用svnsync,它将远程服务器设置为镜像/从属服务器。两周前我们的服务器出现故障,我能够非常轻松地将从属切换到主位置(只需要将从属存储库上的 UUID 重置为原始位置)。
另一个好处是同步可以由中间人运行,而不是作为任一服务器上的任务。我有两个 *** 的客户端在它们之间同步一个存储库。
【讨论】:
所以它显然会在两者之间同步最新的 repo 版本? 尽管它在标题中,但我不知道我会称之为“同步”。它确实是一个备份,它将在主服务器上进行修改并将它们放在从服务器上。如果您对从站进行修改,它们要么会破坏“同步”,要么会导致疯狂。该工具的预期用途是创建异地只读镜像,但它在创建备份服务器方面做得非常出色。 svnsync 的好处是你可以经常运行它。每十分钟甚至每次提交(使用钩子)。这样做的好处是可以减少您在上次备份和实时存储库丢失之间可能会发生的潜在数据丢失。【参考方案6】:svnadmin hotcopy
svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH
此子命令对您的存储库进行完整的“热”备份,包括所有挂钩、配置文件,当然还有数据库文件。
【讨论】:
【参考方案7】:svnbackup 在 Google Code 上,一个 .NET 控制台应用程序。
【讨论】:
【参考方案8】:您可以使用svnadmin dump
创建存储库备份(转储)。
然后您可以使用svnadmin load
将其导入。
SVNBook中的详细参考: "Repository data migration using svnadmin"
【讨论】:
【参考方案9】:基本上,如果 svn 服务器停止,复制存储库文件夹是安全的。 (来源:https://groups.google.com/forum/?fromgroups#!topic/visualsvn/i_55khUBrys%5B1-25%5D)
因此,如果允许您停止服务器,请执行此操作,然后使用一些脚本或备份工具复制存储库。 Cobian Backup 非常适合这里,因为它可以自动停止和启动服务,并且可以进行增量备份,因此您只备份最近更改的存储库部分(如果存储库很大并且您正在备份到远程位置很有用)。
例子:
-
安装 Cobian 备份
添加备份任务:
将源设置为存储库文件夹(例如C:\Repositories\
),
添加预备份事件"STOP_SERVICE"
VisualSVN,
添加备份后事件,"START_SERVICE"
VisualSVN,
根据需要设置其他选项。 我们已经设置了增量备份,包括删除旧备份、备份计划、目标、压缩,包括。档案分割等。
利润!
【讨论】:
【参考方案10】:备份 svn 服务器有两种主要方法,第一种是 hotcopy,它会创建存储库文件的副本,这种方法的主要问题是它保存了有关底层文件系统的数据,所以你可能会遇到一些困难试图将这种备份重新存储在另一个 svn 服务器类型或另一台机器上。 还有另一种类型的备份称为转储,此备份不会将底层文件系统的任何信息保存到任何基于 tigiris.org subversion 的 SVN 服务器中。
关于备份工具,您可以在命令提示符下使用 svnadmin 工具(它能够进行热复制和转储),此控制台位于 svn 服务器所在的同一目录中,或者您可以 google 搜索 svn 备份工具。
我的建议是您进行这两种备份,然后将它们从办公室转移到您的电子邮件帐户、amazon s3 服务、ftp 或 azure 服务,这样您就可以进行安全备份,而无需托管 svn 服务器办公室外的某个地方。
【讨论】:
【参考方案11】:这里是一个 GUI Windows 工具,用于转储本地和远程颠覆存储库:
https://falsinsoft-software.blogspot.com/p/svn-backup-tool.html
工具说明说:
这个简单的工具允许对本地和远程 Subversion 存储库进行转储备份。该软件的工作方式与“svnadmin”相同,但不是它的 GUI 前端。而是直接使用 subversion 库来允许在独立模式下创建转储,而无需任何其他附加工具。
希望对您有所帮助...
【讨论】:
感谢分享,完全按照说明进行。【参考方案12】:我喜欢将整个 repo 目录复制到我的备份位置。这样一来,如果发生什么事情,您只需将目录复制回来即可立即开始。
如果需要,请确保保留权限。通常,这只是 Linux 机器上的一个问题。
【讨论】:
如果有人在复制操作期间进行提交,这并不完全安全——即使只有 4 个人可以访问 repo 并且不经常使用它,我也遇到过这种情况。请参阅 Duncan 关于使用 hotcopy 的回答。 但是,如果您完全独自工作,那么我认为这是备份存储库的安全方法?我将颠覆用于我的个人项目,这就是我目前正在做的事情。【参考方案13】:对于托管存储库,您可以从 svn 版本 1.7 开始使用 svnrdump
,这类似于用于本地存储库的 svnadmin dump
。这个article 提供了一个很好的演练,基本上可以归结为:
svnrdump dump /URL/to/remote/repository > myRepository.dump
下载转储文件后,您可以将其导入本地
svnadmin load /path/to/local/repository < myRepository.dump
或将其上传到您选择的主机。
【讨论】:
【参考方案14】:如果您使用的是 FSFS 存储库格式(默认),那么您可以复制存储库本身以进行备份。对于较旧的 BerkleyDB 系统,存储库不是独立于平台的,您通常希望使用 svnadmin dump。
svnbook documentation topic for backup 推荐使用svnadmin hotcopy
命令,因为它会处理文件使用等问题。
【讨论】:
【参考方案15】:@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
这是我正在运行的执行备份的批处理文件
【讨论】:
【参考方案16】:对于每日和完整备份解决方案,只需使用SVN backup scripts here。
【讨论】:
【参考方案17】:我已经编译了我为备份远程 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 是否也带来了所有历史记录,SVN 签出是使用 -r
和 2、10、50 等对各种旧版本运行的。然后确认 <local-dir-path-to-checkout-onto>
中的文件来自该版本。
最后,压缩目录C:/Documents and Settings\nverma/.svk/local/
并将压缩文件存储在某处。经常这样做。
【讨论】:
【参考方案18】:正如其他人所说,来自 Subversion 团队的 hot-backup.py 比普通的 svnadmin hotcopy
具有一些不错的功能
我在 python 脚本上运行一个计划任务,该脚本在机器上搜索我的所有存储库,并使用 hotbackup 在远程机器上保留几天的热副本(对损坏的偏执)和svnadmin svndump
。从那以后恢复真的很容易 - 到目前为止。
【讨论】:
【参考方案19】: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 Dump 和 Gzip Dump with One-liner
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 backup andrestore
【讨论】:
以上是关于SVN 仓库备份策略的主要内容,如果未能解决你的问题,请参考以下文章
Azure Data PlatformSQL DW 备份策略