如何对我的 VisualSVN Repos 进行每日备份?

如何对我的 VisualSVN Repos 进行每日备份?

如何对我的 VisualSVN Repos 进行每日备份?

它在装有 VisualSVN Server 的 Windows Server 2003 计算机上,我正在考虑只对该文件夹进行 xcopy回购但我对 svn 不够熟悉,不知道这是否会导致问题。

我应该使用 dump 还是 hotcopy,或者两者兼而有之?

答案1

它是一堆文件,就像任何其他文件一样。使用任何方法备份系统的其余部分。由于这是在服务器上,我原以为它已经包含在常规备份方案中。

如果您使用的是还不错的备份软件,即使是 Windows 自己的 NT Backup,它也应该使用卷影复制服务,该服务将处理打开文件的问题(如果有)。

答案2

仅复制 repo 文件不是一个好主意:

...除非您暂时禁用对存储库的所有其他访问,否则仅执行递归目录复制就会有生成错误备份的风险。

你应该使用svnadmin 热复制命令。

存储库维护 > 存储库备份

您可以编写脚本并将其作为计划任务运行。

答案3

我同时进行转储和热复制。将它们放入批处理文件中,并使用任务计划程序创建任务以每天运行它。这是我的示例批处理文件

!backing up credentials
copy H:\Repositories\authz G:\Repo-Backups\7-22-2013\backup
copy H:\Repositories\authz-windows G:\Repo-Backups\7-22-2013\backup
copy H:\Repositories\htpasswd G:\Repo-Backups\7-22-2013\backup

!full dump
svnadmin dump H:\Repositories\Proj1 > G:\Repo-Backups\7-22-2013\dump\Proj1
svnadmin dump H:\Repositories\Proj2 > G:\Repo-Backups\7-22-2013\dump\Proj2 

!hard copy
svnadmin hotcopy H:\Repositories\Proj1 G:\Repo-Backups\7-22-2013\backup\Proj1
svnadmin hotcopy H:\Repositories\Proj2 G:\Repo-Backups\7-22-2013\backup\Proj2 

如果您有多个存储库(项目)需要备份,并且它们经常更改,那么使用一个小程序为您创建上述批处理文件会更容易。以下是我为此编写的内容:

    public static void CreateBackupScript(string srcFolder, string desFolder, bool fullDump)
        { 
if (string.IsNullOrEmpty(srcFolder) || string.IsNullOrEmpty(desFolder))
            return;

        var dateString = DateTime.Now.ToShortDateString().Replace('/', '-');
        var destination = System.IO.Path.Combine(desFolder, dateString, "backup");

        if (!Directory.Exists(destination))
            Directory.CreateDirectory(destination);

        var source = srcFolder + "\\";
        var outputScript = "backup.cmd";
        using (StreamWriter sw = new StreamWriter(outputScript))
        {
            sw.WriteLine("!backing up credentials");
            sw.WriteLine("copy {0}authz {1}", source, destination);
            sw.WriteLine("copy {0}authz-windows {1}", source, destination);
            sw.WriteLine("copy {0}htpasswd {1}", source, destination);

            // dump
            if (fullDump == true)
            {
                sw.WriteLine("!full dump");

                var dumpFolder = System.IO.Path.Combine(desFolder, dateString, "dump");

                if (!Directory.Exists(dumpFolder))
                    Directory.CreateDirectory(dumpFolder);

                foreach (var dir in new DirectoryInfo(source).GetDirectories("*.*", SearchOption.TopDirectoryOnly))
                {
                    sw.WriteLine(@"svnadmin dump {0} > {1}\{2}", dir.FullName, dumpFolder, dir.Name);
                }
            }

            //hot copy
            sw.WriteLine("!hard copy");
            foreach (var dir in new DirectoryInfo(source).GetDirectories("*.*", SearchOption.TopDirectoryOnly))
            {
                sw.WriteLine(@"svnadmin hotcopy {0} {1}\{2}", dir.FullName, destination, dir.Name);
            }
        }
    }

相关内容