【问题标题】:Please create a master key in the database or open the master key in the session before performing this operation请在数据库中创建主密钥或在会话中打开主密钥,然后再执行此操作
【发布时间】:2017-09-22 21:52:56
【问题描述】:

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

【问题讨论】:

    标签: sql encryption certificate sql-server-2016 private-key


    【解决方案1】:

    固定。

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

    这一段给了它:

    每当 DMK 更改时,存储在 ma​​ster 系统数据库中的 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
    

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

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

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

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

    哇哦!任务完成。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我不确定这是否正是您要查找的内容,但 OPEN MASTER KEY 备注似乎有些相关。

        您将 100% 想在生产环境中测试它,但似乎一旦打开主密钥,您就可以选择不使用 ALTER MASTER KEY REGENERATE 命令。

        如果数据库主密钥是用服务主密钥加密的, 需要解密或解密时会自动打开 加密。在这种情况下,没有必要使用 OPEN MASTER 关键声明。

        当一个数据库第一次附加或恢复到一个 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

        【讨论】:

        • 感谢 CK 的帮助,我尝试了 Alter master key regen 但没有奏效,我仍然得到同样的错误。
        猜你喜欢
        • 1970-01-01
        • 2013-12-25
        • 2011-06-12
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多