如何对我的 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);
}
}
}