適用対象:SQL Server
Azure SQL データベース
Azure SQL Managed Instance
この記事では、インスタント ファイル初期化 (IFI) と、それを有効にして SQL Server データベース ファイルの拡張を高速化する方法について説明します。
デフォルトでは、データおよびログ ファイルの初期化は、ディスクに以前削除したファイルのデータが残っている場合にそれを上書きするために行います。 次の操作を実行すると、データとログ ファイルは、まずファイルのゼロイング (ゼロを書き込む処理) で初期化されます。
- データベースを作成します。
- 既存のデータベースへのデータ ファイルまたはログ ファイルの追加。
- 既存のファイルのサイズを大きくする (自動拡張操作を含む)。
- データベースまたはファイル グループの復元。
SQL Server では、ファイルの瞬時初期化によって、前述のファイル操作を高速に実行できます。これは、使用されているディスク領域をゼロで埋めることなく再利用するためです。 代わりに、新しいデータがファイルに書き込まれると、古いディスク コンテンツが上書きされます。
Azure SQL データベースと Azure SQL Managed Instance では、ファイルの瞬時初期化はトランザクション ログ ファイルにのみ利用できます。
ファイルの瞬時初期化とトランザクション ログ
適用対象: SQL Server 2022 (16.x) 以降のバージョン、および Azure SQL データベース、および Azure SQL Managed Instance。
これまで、トランザクション ログ ファイルを瞬時に初期化できませんでした。 ただし、SQL Server 2022 (16.x)以降(すべてのエディション)、ならびに Azure SQL データベースと Azure SQL Managed Instance では、最大 64 MB のトランザクション ログの自動拡張イベントはファイルの瞬時初期化のメリットを受けられます。 新しいデータベースのデフォルトの自動拡張サイズの拡張は 64 MB です。 64 MB を超えるトランザクション ログ ファイルの自動拡張イベントについては、ファイルの瞬時初期化の恩恵を得ることができません。
透過的なデータ暗号化 (TDE) が有効になっている場合に防止されるデータ ファイルのファイルの瞬時初期化とは異なり、トランザクション ログ ファイルのサイズが大きくなり、トランザクション ログがシリアル形式で書き込まれるため、TDE が有効になっているデータベースでトランザクション ログの拡張に対してファイルの瞬時初期化が許可されます。
ファイルの瞬時初期化は、トランザクション ログ ファイルの増加に役立つためだけに、Azure SQL Database および Azure SQL Managed Instance の General Purpose レベルと Business Critical レベルで使用されます。
ファイルの瞬時初期化は、Azure SQL Database と Azure SQL Managed Instance では構成できません。
ファイルの瞬時初期化の有効化
データ ファイルの瞬時ファイル初期化は、データベース エンジン サービスのサービス アカウントまたはサービス SID に SE_MANAGE_VOLUME_NAME
権限が付与されている場合にのみ使用できます。 Windows Administrators グループのメンバーは、この権限を持ち、 ボリューム メンテナンス タスクの実行 セキュリティ ポリシーに追加することで、その権限を他のユーザーに付与できます。 sql Server 2022 (16.x) のリリースで導入されたトランザクション ログで最大 64 MB の拡張イベントのファイルの瞬時初期化には、 SE_MANAGE_VOLUME_NAME
特権は必要ありません。
データベース エンジン サービスのサービス SID にSE_MANAGE_VOLUME_NAME
権限を付与することをお勧めします。 これにより、データベース エンジン サービスのサービス アカウントを変更した場合でも、許可が維持されます。 詳細については、「 サービス SID を使用して SQL Server のサービスにアクセス許可を付与する」を参照してください。
重要
Transparent Data Encryption (TDE) など、一部の機能の使用によってファイルの瞬時初期化 (IFI) を防止できます。 SQL Server 2022 (16.x) 以降のバージョン、および Azure SQL Database と Azure SQL Managed Instance では、トランザクション ログで IFI が許可されます。 詳細については、「ファイルの瞬時初期化とトランザクション ログ」を参照してください。
SQL Server 2016 (13.x) 以降のバージョンでは、セットアップ時に、インストール時にデータベース エンジン サービス セキュリティ識別子 (SID) にこのアクセス許可を付与できます。
コマンド プロンプト インストールを使用する場合、/SQLSVCINSTANTFILEINIT
引数を追加するか、インストール ウィザードで [SQL Server データベース エンジン サービスにボリューム メンテナンス タスクを実行する特権の付与] のボックスにチェックを入れます。
アカウントまたはサービス SID に Perform volume maintenance tasks
セキュリティ ポリシーを付与するには:
データ ファイルが作成されるコンピューターで、 ローカル セキュリティ ポリシー アプリケーション (
secpol.msc
) を開きます。左側のペインで [ローカル ポリシー]を展開し、 [ユーザー権利の割り当て]を選択します。
右側のペインで、[ボリュームの保守タスクを実行]をダブルクリックします。
[ ユーザーまたはグループの追加] を選択し、データベース エンジン サービス アカウントまたはそのサービス SID を追加します。
[適用]を選択し、[ローカル セキュリティ ポリシー] ダイアログ ボックスをすべて閉じます。
データベース エンジン サービスを再起動します。
起動時にデータベース エンジンのエラー ログを確認します。
適用対象: SQL Server (SQL Server 2012 (11.x) SP4、SQL Server 2014 (12.x) SP2、SQL Server 2016 (13.x) 以降)。
データベース エンジン サービス アカウントまたはそのサービス SID に
SE_MANAGE_VOLUME_NAME
権限が付与されている場合、次の例のような情報メッセージがログに記録されます。Database Instant File Initialization: enabled. For security and performance considerations see the topic 'Database Instant File Initialization' in SQL Server Books Online. This is an informational message only. No user action is required.
データベース エンジン サービス アカウントまたはそのサービス SID に
SE_MANAGE_VOLUME_NAME
権限が付与されていない場合は、次の例のような情報メッセージがログに記録されます。Database Instant File Initialization: disabled. For security and performance considerations see the topic 'Database Instant File Initialization' in SQL Server Books Online. This is an informational message only. No user action is required.
セキュリティに関する考慮事項
メリットがセキュリティ リスクを上回る可能性があるため、ファイルの瞬時初期化を有効にすることを推奨します。
ファイルの瞬時初期化を使用する場合、削除されたディスクの内容は、新しいデータがファイルに書き込まれるときにのみ上書きされます。 そのため、他のデータがデータ ファイルのその特定の領域に書き込まれるまで、削除された内容が許可されていないプリンシパルによってアクセスされる可能性があります。
データベース ファイルが SQL Server のインスタンスにアタッチされている間は、ファイルに対する随意アクセス制御リスト (DACL) により、このような情報漏えいのリスクは軽減されます。 DACL では、SQL Server サービス アカウント、そのサービス SID、およびローカル管理者にのみファイル アクセスを許可します。 ただし、ファイルがデタッチされると、 SE_MANAGE_VOLUME_NAME
特権を持たないユーザーまたはサービスからアクセスできる可能性があります。
次の場合にも同じようなことを考慮する必要があります。
データベースがバックアップされています。 バックアップ ファイルが適切な DACL で保護されていない場合、許可されていないユーザーやサービスに削除された内容を利用される可能性があります。
IFI を使用してファイルが拡張されています。 SQL Server 管理者が未加工のページ コンテンツにアクセスして、以前削除されたコンテンツを表示する可能性があります。
データベース ファイルが記憶域ネットワークにホストされています。 記憶域ネットワークで常に新しいページが事前に初期化されているものとして示される可能性もあり、オペレーティング システムがページを初期化することは不要なオーバーヘッドになることがあります。
削除された内容が公開される可能性が懸念される場合は、次のいずれか、または両方の対策を行う必要があります。
デタッチされたすべてのデータ ファイルおよびバックアップ ファイルに、常に限定的な DACL が設定されるようにする。
SQL Server のインスタンスでデータ ファイルの瞬時初期化を無効にします。 これを行うには、データベース エンジン サービス アカウントとそのサービス SID から
SE_MANAGE_VOLUME_NAME
を取り消します。Note
IFI を無効にすると、データ ファイルの増加時間が長くなり、権限が取り消された後に作成またはサイズが増えたファイルにのみ影響します。
SE_MANAGE_VOLUME_NAME特権
SE_MANAGE_VOLUME_NAME
権限は、Windows 管理ツールのローカル セキュリティ ポリシー アプレットで割り当てることができます。
[ローカル ポリシー] で [User Right Assignment]\(ユーザー権限の割り当て\) を選択し、[ボリュームの保守タスクを実行] プロパティを変更します。
パフォーマンスに関する考慮事項
データベース ファイルの初期化プロセスでは、初期化中のファイルの新しい領域にゼロが書き込まれます。 このプロセスの実行時間は、初期化されるファイル部分のサイズと、ストレージ システムの応答時間と容量によって異なります。 初期化に時間がかかる場合は、SQL Server エラー ログとアプリケーション ログに次のメッセージが記録されている可能性があります。
Msg 5144
Autogrow of file '%.*ls' in database '%.*ls' was cancelled by user or timed out after %d milliseconds. Use ALTER DATABASE to set a smaller FILEGROWTH value for this file or to explicitly set a new file size.
Msg 5145
Autogrow of file '%.*ls' in database '%.*ls' took %d milliseconds. Consider using ALTER DATABASE to set a smaller FILEGROWTH for this file.
データベースやトランザクション ログ ファイルの長時間の自動拡張によって、クエリ パフォーマンスの問題が発生する可能性があります。 ファイルの自動拡張を必要とする操作は、ファイルの拡張操作中にロックやラッチなどのリソースを保持します。 割り当てページのラッチで長い待機時間が発生する場合があります。 長時間の自動拡張を必要とする操作では、PREEMPTIVE_OS_WRITEFILEGATHER
の待機の種類が表示されます。