我如何为VisualSVN Repos做每日备份?
它在一个Windows Server 2003的机器与VisualSVN服务器,我想只做一个xcopy的文件夹C:\回购,但我不熟悉svn知道这是否会导致问题。
我应该使用dump还是hotcopy?
这是一堆文件,就像其他任何文件一样。 使用任何方法来备份系统的其余部分。 因为这是在服务器上,我以为它已经被包含在常规的备份scheme中。
如果您使用的是半软件备份软件,即使Windows拥有NT备份,也应该使用卷影复制服务,该服务将处理打开的文件问题(如果有的话)。
只要复制回购文件是一个坏主意:
…除非您临时禁用对您的存储库的所有其他访问权限,否则只需执行recursion目录复制即可导致生成错误的备份。
您应该使用svnadmin hotcopy命令。
存储库维护>存储库备份
您可以编写脚本并将其作为计划任务运行。
我做转储和hotcopy。 把它们放在一个batch file中,用Task Scheduler创build一个任务来每天运行它。 这是我的示例batch file
!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
如果您有多个存储库(项目)需要备份并且频繁更改,那么让一个小程序为您创build上述batch file会更容易。 这是我为此写的:
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); } } }