2014-11-14 45 views
1

我正在嘗試從應用程序中執行RavenDB備份/還原。 Raven以嵌入模式運行。我的備份工作正常,現在我需要進行恢復。在現有數據之上還原嵌入式RavenDB

還原問題,我想恢復到當前嵌入式存儲使用的位置。我的計劃是關機嵌入式存儲,刪除位置的所有文件,恢復有:

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

一個解決方法是初始化ravendb(正確在Application_Start中),但不允許ravendb啓動。

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

在webconfig恢復分貝變「RavenDBStartMode」到「DontStart」這樣的應用程序池將重新啓動並開始恢復操作

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(); 

終於改變你的「RavenDBStartMode」到「啓動」再這樣ravendb可以啓動其他重新啓動的原因

+0

這很差。涉及手動重新啓動網站,手動更新'web.config'。相反,我可以停止站點,刪除數據,然後執行還原。有什麼意義? – trailmax

+0

它不需要手動重新啓動網站或手動刪除舊的數據文件,它只是需要從一個ftp客戶端手動更新web.config,我知道它的醜陋,我不能以更簡單的方式做到 –

+0

是的,我忘了更新到'web。 config'會導致站點重新啓動。但更新'web.config'不是一個選項。 – trailmax