レプリカにマスターキー(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
一定。
この段落はそれを与えました:
masterシステムデータベースに格納されているDMKのコピーは、DMKが変更されるたびにサイレントに更新されます。ただし、このデフォルトは、ALTER MASTER KEYステートメントのDROP ENCRYPTION BY SERVICE MASTER KEYオプションを使用して変更できます。サービスマスタキーによって暗号化されていないDMKは、OPEN MASTER KEYステートメントとパスワードを使用して開く必要があります。
セカンダリノードで次を実行しました。
これを確認して解決策に到着しました。
--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;
うわー!任務完了。
これがまさにあなたが探しているものかどうかはわかりませんが、OPEN MASTER KEYの発言には関連性があると思われるものがありました。
これを実稼働環境ではなく100%テストしたいと思うでしょうが、マスターキーが開かれたら、ALTER MASTER KEY REGENERATE
コマンドでそれを要求しないオプションがあるようです。
データベースマスタキーがサービスマスタキーで暗号化されている場合、復号化または暗号化に必要なときに自動的に開かれます。この場合、OPEN MASTER KEYステートメントを使用する必要はありません。
データベースが最初にSQL Serverの新しいインスタンスに接続または復元されるとき、データベースマスタキーのコピー(サービスマスタキーによって暗号化された)はまだサーバーに保存されていません。
OPEN MASTER KEYステートメントを使用して、データベースマスターキー(DMK)を復号化する必要があります。 DMKの暗号化が解除されると、ALTER MASTER KEY REGENERATEステートメントを使用して、サービスマスターキー(SMK)で暗号化されたDMKのコピーをサーバーにプロビジョニングすることにより、将来的に自動暗号化解除を有効にするオプションがあります。
データベースが以前のバージョンからアップグレードされた場合、新しいAESアルゴリズムを使用するためにDMKを再生成する必要があります。 DMKの再生成の詳細については、「ALTER MASTER KEY(Transact-SQL)」を参照してください。 AESにアップグレードするためにDMKキーを再生成するのに必要な時間は、DMKによって保護されているオブジェクトの数によって異なります。 AESにアップグレードするためにDMKキーを再生成する必要があるのは1回だけであり、キーローテーション戦略の一部として将来の再生成に影響はありません。
https://docs.Microsoft.com/en-us/sql/t-sql/statements/open-master-key-transact-sql
私は同じ状況でしたが、MDKを再作成する代わりに、次を実行して問題を修正しました:ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY