※Azure SQL Managed Instance から SQL Server 2022 へのリストアだけでなく、異なる SQL Server インスタンス間のリストアでも該当します。
Azure SQL Managed Instance (MI) で取得したバックアップについては、SQL Server 2022 にリストアすることができます。
MI からリストア可能なバックアップについては、ユーザーが任意のタイミングで取得したバックアップとなるので「COPY_ONLY」オプションを使用して取得したバックアップの必要があります。
MI で COPY_ONLY バックアップを取得するには条件があり、次のいずれかの条件を満たしている必要があります。
- TDE で暗号化されていないデータベース
- ユーザーマネージドキーを使用して TDE を設定している
「サービスマネージドキー」による TDE については、TDE のキーをユーザーが制御できないものとなるため、サービスマネージドキーを使用し TDE を実行している DB については、COPY_ONLY バックアップを取得することができません。
今回は「1.」で記載した TDE を無効にした状態のバックアップを SQL Server 2022 にリストアする際の注意点となります。
「2.」についても、SQL Server 2022 にリストアすることができるのですが、SQL Server 2022 では、Azure Key Vault を使用した SQL Server TDE 拡張キー管理を設定する の設定で、ユーザーマネージドキーの Key Vault へのアクセスをする必要があり、こちらはこちらで面倒ではあるのですが、それについては別の投稿で書こうと思います。
本投稿で対象としている TDE の無効化ですが、「TDE を有効にしている DB で、TDE を無効に変更」した場合が該当します。
「最初から TDE を無効の状態にしている DB」については、本投稿の事象は発生しません。
MI で TDE を無効にした DB をリストアする場合の注意点
TDE を無効にする方法については次のドキュメントに記載されています。
無効化については、次の SQL を実行することになり、これは MI でも同様です。
ALTER DATABASE <db_name> SET ENCRYPTION OFF;
データが格納されている場合、暗号化を無効化すると暗号化の解除が実行されますので、最後まで解除がされたかどうかについては、次のようなクエリで確認できます。
USE master GO SELECT database_id, encryption_state_desc, percent_complete FROM sys.dm_database_encryption_keys WHERE database_id = DB_ID('<db_name>') GO
状態が「DECRYPTION_IN_PROGRESS」から、「UNENCRYPTED」に変更されると暗号化は解除されます。
この状態で COPY_ONLY バックアップを取得し、SQL Server 2022 にリストアすると、次のようなエラーが発生します。
メッセージ 33111、レベル 16、状態 4、行 2
拇印 ‘0x719730DxxxxxxxxxxxxxxxxxxxxxxxECA707’ でサーバー 非対称キー が見つかりません。メッセージ 3013、レベル 16、状態 1、行 2
RESTORE DATABASE が異常終了しています。
TDE を無効にした状態でも、データベース内には データベース暗号化キー は残った状態となっています。これにより、暗号化キーで使用している証明書へのアクセスが発生し、上記のエラーとなります。
SQL Server 2022 から、Key Vault へのアクセスをができるようにすることで上記のエラーを解消できますが、それなら、TDE が有効な状態にしたほうが良いですよね。
TDE が有効な状態にした DB に対して、TDE を無効にし、取得したバックアップを SQL Server 2022 にリストアしたい場合は、TDE の無効化が完了し、バックアップを取得する前に次のクエリを実行し、データベース暗号化キーを DB 内から削除した状態にします。
USE [<db_name>] GO DROP DATABASE ENCRYPTION KEY GO
この状態にしたデータベースのバックアップであれば、TDE が無効化され、データベース暗号化キーも DB 内から削除された状態となっているため、SQL Server 2022 にリストアをすることが可能となります。
「TDE が無効な状態」のデータベースのリストアですが、最初から TDE を使用していないか、TDE を有効にした DB に対して無効にしたかによって、必要となる作業が変わりますので、TDE に関する情報がどこに含まれているかを把握しておくことが重要ではないでしょうか。