如何還原資料庫到 SQL Server 2012 LocalDB 執行個體

黃保翕 (Will 保哥)

JJ694994.060DE5057573180CEC6D227C6D3E2207(zh-tw,TechNet.10).png

2013年2月

文章開始

雖然 SQL 2012 的 LocalDb 與 SQLEXPRESS 師出同門,不過由於執行個體的執行方式不同,因此資料庫特性也有些不太一樣,就以常見的「還原資料庫」功能來說,預設就無法透過 SQL Server Management Studio (SSMS) 進行還原資料庫的動作,雖然透過 T-SQL 指令還是可以正確執行,不過就是麻煩多了!今天我就來分享一個小技巧,讓你能夠使用 SSMS 圖形化操作介面還原資料庫到任意一個 LocalDb 執行個體,省去許多麻煩的 T-SQL 撰寫工作,也簡化還原資料庫到 LocalDb 執行個體的複雜度。

最近漸漸地將開發環境所需的資料庫都整理到 SQL Server 2012 Express LocalDB 執行個體上,一般來說透過卸離(Detach)與附加(Attach)的方式移動資料庫最為方便,不過當你今天拿到的是從其他資料庫備份下來的檔案,那可就一點都不方便了。我們先來看看,透過正常程序執行「還原資料庫」動作時會遇到什麼問題:

  1. 先連接 LocalDb 執行個體

    JJ694994.3426E4D67D86142DACF6D36B52FE8EF4(zh-tw,TechNet.10).png

  2. 試圖執行「還原資料庫」功能

    JJ694994.868D7010462BD0AD07843C3363C3EFA3(zh-tw,TechNet.10).png

  3. 選取先前備份過的檔案,來源部分要選取「裝置」,然後再挑選 SQL Server 的備份檔案 ( *.bak ),不過這時已經可以看到一些錯誤訊息提示了,如下圖紅框處。

    JJ694994.0E24A8F3E2ED5094E87C7066F9E5D414(zh-tw,TechNet.10).png

  4. 當 SQL 備份檔選好,按下「確定」鍵後,就會出現以下錯誤:設定 'Microsoft.SqlServer.Management.Smo.Settings' 無法使用屬性 BackupDirectory。此物件可能沒有此屬性,或因為存取權限不足而無法擷取。 (Microsoft.SqlServer.Smo)

    JJ694994.69DA1C5087621078DB9574FB78CB6FD5(zh-tw,TechNet.10).png

發生這個問題的主因在於 SQL Server 2012 Express LocalDB 並沒有 SQL Server 的資料庫預設位置相關屬性,偏偏 SQL Server Management Studio 必須要有這些屬性資料才能正常執行資料庫還原動作,所以才無法完成資料庫還原這個任務。

我們先連到另一台 SQL Server 2008 Developer Edition 的資料庫執行個體,看看執行個體的屬性設定:

JJ694994.7F280607C7E0225F423A2FB2CDCBCEE3(zh-tw,TechNet.10).png

然後切換到「資料庫設定」頁面,最下方就有三個「資料庫預設位置」的參數設定,無論在 SQL Server 標準版、企業版或 EXPRESS 版都會有這三個屬性值,如下圖示(點圖可放大):

JJ694994.D92640D09997907C28E29C8B03984C6E(zh-tw,TechNet.10).png

當你回到 LocalDb 的執行個體屬性,切換至「資料庫設定」頁面後,將完全看不到任何欄位可設定:

JJ694994.77DB270D2888F7655B8CF53A517710F6(zh-tw,TechNet.10).png


若要解決這個問題,必須修改本機電腦的機碼(Registry)設定,將 LocalDb 缺少的這幾個機碼值補上,就可以透過 SSM 正常使用「資料庫還原」功,以下就是我們要加上的機碼路徑:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\MSSQLServer

在這個機碼路徑下新增以下 3 個字串值 (REG_SZ) 就是我們要加上的「資料庫預設位置」屬性:

  • DefaultData (資料)
  • DefaultLog (紀錄檔)
  • BackupDirectory (備份)

這三個字串值都需要指定一個「目錄路徑」,但因為 LocalDb 的每個執行個體都是以不同使用者身分執行,所以你要設定的這個目錄必須是「本機所有使用者」都能夠存取的目錄才有意義,整台電腦最沒問題的目錄當然也就是「系統暫存目錄」,也就是 C:\Windows\Temp 目錄,所以本文章會以此目錄當作設定的範例,你當然也可以指定到其他目錄。

新增機碼最簡單的解決方法,就是直接執行以下三行指令,請先進入「命令提示字元」並執行下列指令:

view plaincopy to clipboardprint?

  1. REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\MSSQLServer" /v BackupDirectory /t REG_SZ /d "C:\Windows\Temp" /F  
    

  2. REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\MSSQLServer" /v DefaultData /t REG_SZ /d "C:\Windows\Temp" /F  
    

  3. REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\MSSQLServer" /v DefaultLog /t REG_SZ /d "C:\Windows\Temp" /F  
    

機碼新增完成後若使用 regedit 工具看到的畫面如下:

JJ694994.278A736BFBF5993D9176090787326BCB(zh-tw,TechNet.10).png

設定完成後,所有還原資料庫的問題也都將迎刃而解,日後使用「還原資料庫」功能時將跟以往使用 Management Studio 的經驗完全一致,只是唯一要注意的事情就是:你日後建立資料庫時的「資料庫預設路徑」將會置於你所指定的目錄下,可別找不到了!


相關連結


顯示: