Восстановить зашифрованную базу данных на другом сервере

10

Я использую продукт, который работает на SQLServer 2008. Понятно, что компания, поставляющая его, не предлагает поддержку SQLServer. Когда я установил продукт, я указал пароль для шифрования базы данных. Я хотел бы запустить еще одну копию продукта для тестирования на другом сервере. Я восстановил базу данных на другом сервере и установил продукт на этом другом сервере. Когда я установил его, я ввел тот же пароль, а затем восстановил резервную копию с основного сервера. Однако я получаю сообщение об ошибке:

System.Data.SqlClient.SqlException: An error occurred during decryption.

из продукта. Я могу получить доступ к таблицам с помощью SQLServer Management studio.

Я пробовал это:

на первом сервере:

CREATE CERTIFICATE cert1 WITH SUBJECT = 'Certificate for my stuff'

BACKUP CERTIFICATE  cert1 TO FILE = 'd:\backup\cert1.dat' 
WITH PRIVATE KEY 
(
ENCRYPTION BY PASSWORD = 'mypassword',
FILE = 'd:\backup\cert1_privatekey.dat'
)

на втором сервере:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'mypassword'

CREATE CERTIFICATE cert1 FROM FILE = 'd:\cert1.dat'
WITH PRIVATE KEY
(
FILE = 'd:\cert1_privatekey.dat',
DECRYPTION BY PASSWORD = 'mypassword'
)

Я также попробовал это на втором сервере:

alter MASTER KEY regenerate with enCRYPTION BY PASSWORD='password'

но это дало сообщение об ошибке асимметричного ключа.

Как я могу восстановить резервную копию с первого сервера на второй сервер?

Обновить:

В базе данных также есть асимметричный и симметричный ключ. Если я открываю симметричный ключ с помощью асимметричного ключа, я получаю ту же ошибку, поэтому я думаю, что именно поэтому она не работает - почему-то ключи не передаются таким образом, что их можно использовать.

paulmorriss
источник

Ответы:

8

Я написал запись в блоге о зеркалировании и TDE.

Мне потребовалось некоторое время, чтобы понять, что для получения БД на вторичном сервере мне понадобилась строка кода:

 OPEN MASTER KEY DECRYPTION BY PASSWORD = 'SomePassword'
 ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
 GO

Пароль тот же, который я использовал для шифрования файла мастер-ключа. После выдачи команды на 2-й SQL-сервер все играло хорошо. Вот пост db.stackexchange, который я также сделал.

битпоток
источник
Эта запись в блоге полезна. Я следовал за этим, за исключением того, что вместо «master» я использую конкретную базу данных, которую хочу скопировать. Я получаю сообщение об ошибке «Произошла ошибка при расшифровке асимметричного ключа« asym_something », который был зашифрован старым главным ключом. Параметр FORCE можно использовать для игнорирования этой ошибки и продолжения операции, но данные, которые не могут быть расшифрованы старым главным ключом станет недоступным ". когда я восстановлю мастер-ключ из файла. Должен ли я заставить его? (Это после того, как я восстановил базу данных, тогда как ваши инструкции восстановят ее позже.)
paulmorriss
1
Спасибо, мне потребовалось много времени, чтобы понять это. Э-э, я не уверен, что вы должны это форсировать. Насколько я понимаю, «ключи» привязаны к базам данных MASTER на каждом сервере. Единственное, что связано с базой данных, - это сертификат, подписанный главным ключом. Таким образом, вам нужно создать главный ключ на сервере server1, создать его резервную копию, а затем восстановить ключ на сервере 2. Затем переместите сертификат для базы данных. Я надеюсь, что кто-то еще может пролить свет на эту тему.
RateControl