在现有数据之上恢复嵌入式RavenDB

时间:2014-11-14 00:47:31

标签: ravendb

我正在尝试从应用程序中进行RavenDB备份/恢复。 Raven以嵌入模式运行。我的备份工作正常,现在我需要进行恢复。

要恢复的问题,我想恢复到嵌入式存储当前使用的相同位置。我的计划是关闭嵌入式存储,删除该位置的所有文件,然后在那里恢复:

var configuration = embeddedStore.Configuration;

var backupLocation = // location of a backup folder
var databaseLocation = // location of current DB

// shutdown the storage???
documentStore.Dispose();

// now, trying to delete the directory, I get exception "Can't delete the folder it is in use by other process"
Directory.Delete(databaseLocation, true);  // <-- exception here
Directory.CreateDirectory(databaseLocation);

DocumentDatabase.Restore(configuration, backupLocation, databaseLocation, s => { }, defrag: true);

GitHub上的完整来源)

关闭存储的问题。从我得到的例外情况来看,引擎没有关闭,因为我无法删除文件夹:

  

该进程无法访问文件'_0.cfs',因为它正由另一个进程使用。

我运行的应用程序是MVC5。问题是在web.config中设置了数据库位置,我真的不想以任何方式对其进行修改,因此还原必须与现有数据库位于同一位置。

将嵌入式数据库还原到与现有数据库相同的位置的正确方法是什么?

1 个答案:

答案 0 :(得分:-1)

一个解决方法是初始化ravendb(在Application_Start中正确),条件是不让ravendb启动。

if (WebConfigurationManager.AppSettings["RavenDBStartMode"]=="Start")
    RavenDB.initialize();

用于恢复数据库更改&#34; RavenDBStartMode&#34;到&#34; DontStart&#34;在webconfig中,应用程序池将重新启动并启动还原操作

string dbLocation = Server.MapPath("your database location");
string backupLocation = Server.MapPath("your backup location");

System.IO.File.Delete(dbLocation);

DocumentDatabase.Restore(new RavenConfiguration() { DataDirectory = dbLocation }
, backupLocation, dbLocation, x => { }, false);

RavenDB.initialize();

最后改变你的&#34; RavenDBStartMode&#34;到&#34;开始&#34;再次,所以ravendb可以启动其他重启原因