Я только начинаю экспериментировать с шифрованием резервных копий, думаю, теперь я это понимаю и у меня есть процесс, но с восстановлением происходит что-то странное.
На Сервер А (Стандарт 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.
Но при использовании пользовательского интерфейса для восстановления на сервере B он просто дает базовое сообщение 'Не выбран резервный набор для восстановления'.
Почему это могло быть?
ОБНОВИТЬ: Я только что заметил, что при использовании команд для восстановления резервной копии он будет работать только на сервере B, если я сначала открою главный ключ, иначе он выдает сообщение Please create a master key in the database or open the master key
.
На сервере A мне не нужно этого делать, как будто ключ всегда открыт на сервере A
Я предлагаю вам попробовать разрушить вашу установку и начать все сначала. Вы должен иметь возможность выполнять восстановление из графического интерфейса SSMS, если все ваши сертификаты на месте. Без ваших сценариев установки трудно устранить неполадки, которые могли пойти не так.
Во-первых, на Сервер А, вам нужно создать мастер-ключ:
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!'
);
А теперь возьмите зашифрованную резервную копию (вы можете использовать графический интерфейс, но здесь 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!'
);
Наконец, перейдите в графический интерфейс восстановления базы данных и выберите резервную копию базы данных, которую мы создали с сервера A: И вы увидите, что он успешно читает файл резервной копии и показывает набор резервных копий в нижней сетке экрана восстановления базы данных:
Нажмите ОК, и все будет успешно восстановлено. (Возможно, вам потребуется перейти к экрану «Файлы», чтобы изменить расположение файлов данных, которые необходимо восстановить.)