在执行此操作之前,请在数据库中创建主密钥或在会话中打开主密钥

问题描述:

即使副本具有主密钥(dmk),当尝试还原加密备份时,在辅助副本上出现以下错误,服务主密钥,从生成备份的始发/主服务器恢复的证书和私钥。在执行此操作之前,请在数据库中创建主密钥或在会话中打开主密钥

Msg 15581, Level 16, State 7, Line 137 
Please create a master key in the database or open the master key in the session before performing this operation. 
Msg 3013, Level 16, State 1, Line 137 
VERIFY DATABASE is terminating abnormally. 

为了规避错误,我打开和关闭了像这样的操作的主密钥。但是,在主服务器上,我不需要打开和关闭主密钥来执行操作。

OPEN MASTER KEY DECRYPTION BY PASSWORD = 'MyTest!M4st3rPass'; 
RESTORE VERIFYONLY FROM DISK = '\\FS1\SqlBackups\SQL01\SystemDbs\msdb_backup_2017_09_22_171915_6346240.bak' WITH FILE = 1, NOUNLOAD, NOREWIND; 
CLOSE MASTER KEY ; 

我相信这是因为主与加密指纹备份历史,但我想知道如果我失去了一些东西别的相关的次级。

但是,毕竟,由于证书已在辅助数据库上恢复,因此我将其分配给备份加密的SystemsDB备份维护计划选项,但如果我出于相同原因检查验证选项,则作业将失败。

Source: Back Up Database Task 
Executing query "BACKUP DATABASE [master] TO DISK = N'\\FS1\SqlBac...".: 50% complete 
End Progress 
Error: 2017-09-22 17:08:09.28 
Code: 0xC002F210 
Source: Back Up Database Task Execute SQL Task 
**Description**: Executing the query "declare @backupSetId as int select @backupSetId =..." 
failed with the following error: "Please create a master key in the database or open the master key in the session before performing this operation. 
VERIFY DATABASE is terminating abnormally.". 
Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly. 
End Error 

固定。

参考:https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/sql-server-and-database-encryption-keys-database-engine

这一段给了它扔掉:

每当DMK改变存储在系统数据库中的DMK的副本默默地更新。但是,可以通过使用ALTER MASTER KEY语句的DROP加密服务主密钥选项来更改此默认值。未使用服务主密钥加密的DMK必须通过使用OPEN MASTER KEY语句和密码来打开。

在我的辅助节点上运行以下内容。

  1. 跌落证书...
  2. 降主密钥
  3. 创建主密钥...
  4. 由文件创建证书...

选中此之后抵达的解决方案。

--on primary, output: master 
select name from sys.databases where is_master_key_encrypted_by_server=1 

--on secondary, output: nothing... 
select name from sys.databases where is_master_key_encrypted_by_server=1 

所以我想如果我可以得到主密钥默认由服务主密钥加密,那么这将自动解密。

--on secondary 
drop certificate [BackupCertWithPK] 
drop master key 

--Skipped restore master key from file. 
--Instead, I ran create master key with password. 
create master key encryption by password = 'MyTest!Mast3rP4ss'; 

--verify by open/close. 
open master key decryption by password = 'MyTest!Mast3rP4ss'; 
close master key; 

--proceed to restore/create cert from file. 
create cerfiticate [BackupCertWithPK] 
from file = '\\FS1\SqlBackups\SQL1\Donot_delete_SQL1-Primary_BackupCertWithPK.cer' 
with private key (file = '\\FS1\SqlBackups\SQL1\Donot_delete_SQL1-Primary_BackupCertWithPK.key' , decryption by password = '[email protected]') ; 

之后,再次运行上述选择。

--on secondary, output: master, now there was hope again! 
select name from sys.databases where is_master_key_encrypted_by_server=1 

最后,我重新运行备份作业,成功为验证和加密设置了选项。验证步骤没有失败,也没有提示打开/关闭主密钥。

以下只是按照预期工作,无需打开/关闭主密钥。

RESTORE VERIFYONLY FROM DISK = '\\FS1\SqlBackups\SQL01\SystemDbs\msdb_backup_2017_09_22_171915_6346240.bak' WITH FILE = 1, NOUNLOAD, NOREWIND; 

Wohooo!任务完成。

我不能肯定,如果这正是你在找什么,但OPEN MASTER KEY的话有一些东西,似乎有关。

你会100%希望测试这个不在生产中,但似乎一旦主密钥已被打开,你可以选择不要求与ALTER MASTER KEY REGENERATE命令。

如果数据库主密钥与该服务主密钥加密, 它将需要用于解密或加密 时自动打开。在这种情况下,没有必要使用OPEN MASTER KEY语句。

当数据库首次附加或还原到 SQL Server的新实例时,数据库主密钥 (由服务主密钥加密)的副本尚未存储在服务器中。

您必须使用OPEN MASTER KEY语句来解密数据库 主密钥(DMK)。 DMK解密后,您可以选择 ,通过使用ALTER MASTER KEY REGENERATE语句为服务器配置使用服务主密钥(SMK)加密的DMK 副本,以启用将来的自动解密。

当数据库从早期版本升级时,DMK应该重新生成 以使用更新的AES算法。有关 重新生成DMK的更多信息,请参阅ALTER MASTER KEY(Transact-SQL)。重新生成DMK密钥以升级到AES所需的时间 取决于受DMK保护的对象数量 。重新生成DMK密钥到 升级到AES只需要一次,并且不会影响未来的再生作为密钥轮换策略的一部分。

https://docs.microsoft.com/en-us/sql/t-sql/statements/open-master-key-transact-sql

+1

Thx的帮助CK,我试过Alter万能钥匙regen但没有工作,我仍然得到相同的错误。 – Hiram