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

Hir*_*ram 7 sql encryption certificate sql-server-2016 private-key

尝试还原加密备份时,即使副本具有从生成备份的原始/主服务器还原的主密钥(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.
Run Code Online (Sandbox Code Playgroud)

为了避免错误,我围绕此类操作打开和关闭主键。但是,在主数据库上,我不需要打开和关闭主键即可进行操作。

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 ;
Run Code Online (Sandbox Code Playgroud)

我相信这是因为主数据库具有加密指纹的备份历史记录,但是我想知道是否遗漏了与第二数据库有关的其他内容。

但是,毕竟,由于该证书已在第二副本上还原,因此我将其分配给用于备份加密的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 
Run Code Online (Sandbox Code Playgroud)

小智 8

我遇到了同样的情况,但我没有重新创建 MDK,而是运行了以下命令来解决问题:ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY


Hir*_*ram 7

固定的。

参考: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 ENCRYPTION BY SERVICE MASTER KEY选项更改此默认值。未由服务主密钥加密的 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
Run Code Online (Sandbox Code Playgroud)

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

--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 = 'key_Test!prim@ryP4ss') ; 
Run Code Online (Sandbox Code Playgroud)

在此之后再次运行上面的选择。

--on secondary, output: master, now there was hope again!
select name from sys.databases where is_master_key_encrypted_by_server=1
Run Code Online (Sandbox Code Playgroud)

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

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

RESTORE VERIFYONLY FROM DISK = '\\FS1\SqlBackups\SQL01\SystemDbs\msdb_backup_2017_09_22_171915_6346240.bak' WITH FILE = 1, NOUNLOAD, NOREWIND;
Run Code Online (Sandbox Code Playgroud)

哇哦!任务完成。