关于Windows:SVN存储库备份策略

关于Windows:SVN存储库备份策略

SVN repository backup strategies

我是SVN的新手,我想知道哪些方法可用于在Windows环境中备份存储库?


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

1
svnadmin dump repositorypath | gzip > backupname.svn.gz

由于Windows不支持GZip,因此:

1
svnadmin dump repositorypath > backupname.svn

我们使用svnadmin hotcopy,例如:

1
2
3
svnadmin hotcopy C:\svn
epo D:\backups\svn
epo

根据这本书:

You can run this command at any time and make a safe copy of the repository, regardless of whether other processes are using the repository.

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


Subversion网站上有一个hotbackup.py脚本,对于自动执行备份非常方便。

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


这是一个Perl脚本,它将:

  • 备份仓库
  • 通过SCP将其复制到另一台服务器
  • 取回备份
  • 从备份创建测试存储库
  • 做一个测试结帐
  • 给您发任何错误的电子邮件(通过cron)
  • 剧本:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    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"
    Dumping Subversion repo $svn_repo to $bkup_file...
    ";
    print `$dump_command`;
    print"Backing up through revision $youngest...
    ";
    print"
    Compressing dump file...
    ";
    print `gzip -9 $bkup_dir/$bkup_file
    `;
    chomp $bkup_file;
    my $zipped_file = $bkup_dir ."/" . $bkup_file .".gz";
    print"
    Created $zipped_file
    ";
    print `scp $zipped_file $bkup_svr_login\@$bkup_svr:/home/backup/`;
    print"
    $bkup_file.gz transfered to $bkup_svr
    ";

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

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


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

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


    svnadmin hotcopy

    1
    svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH

    This subcommand makes a full"hot" backup of your repository, including all hooks, configuration files, and, of course, database files.


    • 您可以使用svnadmin dump创建存储库备份(转储)。

    • 然后可以使用svnadmin load将其导入。

    SVNBook中的详细参考:
    "使用svnadmin进行存储库数据迁移"


    通过.NET控制台应用程序Google Code进行svnbackup。


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

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

    例:

  • 安装Cobian备份
  • 添加备份任务:

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

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

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

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

  • 利润!


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

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

    工具说明如下:

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

    希望能有所帮助...


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

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

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


    对于托管存储库,您可以从svn 1.7版本开始使用svnrdump,这与本地存储库的svnadmin dump类似。本文提供了一个不错的演练,其本质可以归结为:

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

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

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

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


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

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


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

    svnbook文档备份主题推荐使用svnadmin hotcopy命令,因为它将处理诸如文件使用等问题。


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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    @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
    我的项目的资料库。

    1
    2
    3
    4
    5
    6
    7
    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
    verma\.svk\local
    内创建了一组文件。

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

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

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

    The svk miror command generates a commit in the just created repository. So all the commits created by the subsequent sync will have revision numbers incremented by one as compared to the remote public repository.

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

    验证:

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

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

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

    为了验证svk是否也包含所有历史记录,使用-r,2、10、50等对SVN签出进行了各种较旧的修订。然后确认中的文件来自该修订。

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


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

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

    真实的例子

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

    1.2 Gzip创建的转储

    1
    gzip -9 /path/to/reponame.dump

    真实的例子

    1
    gzip -9 /backups/testrepo.dump

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

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

    真实的例子

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

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


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

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


    推荐阅读