我刚刚开始尝试加密备份,我想我现在明白了它并且已经让该过程正常运行,但恢复时发生了一些奇怪的事情。
在服务器 A(SQL 2014 标准)我创建了一个新的主密钥和证书,并成功生成了加密的 bak 文件,并且还导出了密钥和证书文件。
在服务器 B(SQL 2014 开发人员)我已成功从服务器 A 恢复主密钥和证书。
我知道这些工作正常,因为我可以使用以下语法将加密的 bak 文件成功恢复到两个服务器:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'xxx';
RESTORE DATABASE testDb FROM DISK = 'C:\testDb.bak' WITH STATS = 5;
CLOSE MASTER KEY;
但使用还原数据库SSMS 中的工具。
恢复到服务器 A 时工作正常。
但是当使用 UI 恢复到服务器 B 时,它只会显示一条基本消息“未选择要恢复的备份集“”。
为什么会这样?
更新:我刚刚注意到,在使用命令恢复备份时,如果我先打开主密钥,它才会在服务器 B 上起作用,否则它会显示消息Please create a master key in the database or open the master key
。
在服务器 AI 上不需要这样做,就好像密钥在服务器 A 上始终处于打开状态一样
答案1
我建议你尝试拆除你的设置并重新开始。你应该只要您的证书都已到位,就可以从 SSMS GUI 进行恢复。如果没有设置脚本,很难排除可能出现的问题。
首先,服务器 A,你需要创建一个主密钥:
USE master
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'SecretPassword!';
然后,创建用于备份的证书:
USE master
GO
CREATE CERTIFICATE BackupEncryptTestCert
WITH SUBJECT = 'AMtwo_BackupCertificate';
并备份该证书,以便您可以在另一台服务器上恢复它:
BACKUP CERTIFICATE BackupEncryptTestCert
TO FILE = 'C:\temp\AMtwo_BACKUP_CERTIFICATE.cer'
WITH PRIVATE KEY
(
FILE = 'C:\temp\AMtwo_BACKUP_CERTIFICATE_PRIVATE_KEY.key',
ENCRYPTION BY PASSWORD = 'Super-DuperSecretPassword!'
);
现在,获取您的加密备份(您可以使用 GUI,但这是 T-SQL):
BACKUP DATABASE Floop
TO DISK = N'C:\SQL\BAK\Floop.bak'
WITH INIT, FORMAT,
ENCRYPTION(ALGORITHM = AES_256, SERVER CERTIFICATE = BackupEncryptTestCert);
现在我们来翻一下服务器 B,并创建一个主密钥(注意:我实际上不需要从其他服务器备份/恢复主密钥):
USE master
GO
CREATE CERTIFICATE BackupEncryptTestCert
WITH SUBJECT = 'AMtwo_BackupCertificate';
现在从备份中创建该证书:
CREATE CERTIFICATE BackupEncryptTestCert
FROM FILE ='C:\temp\AMtwo_BACKUP_CERTIFICATE.cer'
WITH PRIVATE KEY
(
FILE='C:\temp\AMtwo_BACKUP_CERTIFICATE_PRIVATE_KEY.key',
DECRYPTION BY PASSWORD = 'Super-DuperSecretPassword!'
);
最后,转到恢复数据库 GUI,并选择我们从服务器 A 创建的数据库备份: 您将看到它成功读取了备份文件,并在“恢复数据库”屏幕的底部网格中显示备份集:
点击“确定”,所有内容均成功恢复。(您可能需要转到“文件”屏幕来修改要恢复的数据文件的位置。)