2010-01-07 35 views
21

我將SQL Server數據庫從一個系統複製到下一個完全相同的設置,但完全不同的物理機器。我使用了Norton Ghost並手動恢復了文件,例如重新安裝SQL Server 2008 Express後在c:\ Program Files中找到的整個SQL Server 2008文件夾。SQL Server 2008打開主服務器物理服務器更改時發生的關鍵錯誤

我的一個數據庫有一批自己的表,其中一列的啓用AES_256加密。我resetup我IIS7,並試圖運行訪問數據庫,在檢索數據的應用程序,我得到這個錯誤:

Server Error in '/' Application. Please create a master key in the database or open the master key in the session before performing this operation. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Please create a master key in the database or open the master key in the session before performing this operation.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

我已經做了一些閱讀和發現對AES加密如何與鏈接一些鏈接機器的關鍵,但是如何將其複製到新系統中卻是一種損失。或者甚至可能並非如此。

注:我已經試過下探對稱密鑰,證書和主密鑰並重新創建它們。這消除了錯誤,但是通過AES_256加密的數據沒有顯示出來。然而,未加密的列確實如此。

任何幫助將不勝感激。提前致謝!

回答

64

數據庫主密鑰是使用所述服務器的主密鑰,這是特定到安裝SQL Server的計算機加密。將數據庫移動到另一臺服務器時,由於本地服務器密鑰很可能不同,因此無法自動解密並打開數據庫主密鑰。如果無法解密數據庫主密鑰,則無法解密任何依賴於它的其他證書(證書,對稱密鑰等)。

基本上你想要的(使用管理員特權時)重新加密對新的服務器密鑰,可以使用此腳本來完成數據庫主密鑰:

-- Reset database master key for server (if database was restored from backups on another server) 
OPEN MASTER KEY DECRYPTION BY PASSWORD = '---your database master key password---' 
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY 
GO 

注意,當你創建一個數據庫主密鑰,您應該始終提供密碼,以便您可以在服務主密鑰無法使用的場景中使用密碼打開密鑰 - 希望您已將該密碼存儲在某處!

另外,您可以還原數據庫主密鑰的備份 - 但你需要在目標服務器而不是源服務器創建一個。

如果您還沒有備份或密碼,那麼我不確定您將能夠恢復新服務器上的加密數據,因爲您必須刪除並重新創建數據庫主密鑰新的密碼,這將殺死任何相關的密鑰和數據。

+3

哇靠!你是我的救星!如果我可以點擊這個向上箭頭一千次,我會!非常感謝! – 2010-01-08 04:07:25

3

我剛做了類似的情況,一個服務器重建OS驅動搶救無效死亡。我重新安裝了SQL,並將其重新連接到未觸及的數據驅動器上的所有舊數據庫。一切工作除了我的加密列。但我的問題是主服務密鑰已被清理。我可以通過返回相同域的憑證來修復我的主服務密鑰,該憑證在移動之前就已經是我的SQL服務器服務帳戶。

This article給了我修正(榮譽Matt Bowler爲他的優秀文章)。我知道本地機器密鑰已經改變,但我的救援是我可以使用相同的服務帳戶。

服務主密鑰:密鑰層次結構的頂部是服務主密鑰。每個SQL Server實例有一個,它是一個對稱密鑰,並存儲在master數據庫中。用於加密首次啓動SQL Server時生成的數據庫主密鑰,鏈接服務器密碼和憑證。

沒有與此密鑰關聯的用戶可配置密碼 - 它由SQL Server服務帳戶和本地計算機密鑰加密。啓動時,SQL Server可以使用這些解密中的任何一種來打開服務主密鑰。如果其中一個失敗 - SQL Server將使用另一個並'修復'失敗的解密(如果兩者都失敗 - SQL Server將會出錯)。這是爲了解決像故障轉移後本地機器密鑰會不同的情況。這也是使用SQL Server配置管理器更改服務帳戶的一個原因 - 因爲此時服務主密鑰加密會正確重新生成。

http://mattsql.wordpress.com/2012/11/13/migrating-sql-server-databases-that-use-database-master-keys/