データベースのファイルの瞬時初期化

適用対象: 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 を超えるトランザクション ログ ファイルの自動拡張イベントについては、ファイルの瞬時初期化の恩恵を得ることができません。

トランザクション ログ ファイルの展開方法の性質と、トランザクション ログがシリアル形式で書き込まれるという事実により、Transparent Data Encryption (TDE) を持つデータベースでは、このファイルの瞬時初期化 を使用してトランザクション ログを拡張できます。

  • ファイルの瞬時初期化は、トランザクション ログ ファイルの増大に利益をもたらすためだけに、Azure SQL Database および Azure SQL Managed Instance の General Purpose レベルと Business Critical レベルでのみ使用されます。
  • ファイルの瞬時初期化は、Azure SQL Database と Azure SQL Managed Instance では構成できません。

ファイルの瞬時初期化の有効化

データ ファイルの瞬時初期化は、SQL Server サービス開始アカウントに SE_MANAGE_VOLUME_NAME が付与されている場合にのみ使用できます。 Windows Administrator グループのメンバーにはこの権限があり、他のユーザーを ボリュームの保守タスクを実行 セキュリティ ポリシーに追加することにより、これらのユーザーにこの権限を許可することができます。 SE_MANAGE_VOLUME_NAME 権限は、SQL Server 2022 (16.x) のリリースで導入されたトランザクション ログで最大 64 MB の拡張イベントのファイルの瞬時初期化には必要ありません。

重要

Transparent Data Encryption (TDE) など、一部の機能の使用によってファイルの瞬時初期化 (IFI) を防止できます。 SQL Server 2022 (16.x) 以降、Azure SQL データベースおよび Azure SQL Managed Instance では、トランザクション ログで IFI が許可されます。 詳細については、「ファイルの瞬時初期化とトランザクション ログ」を参照してください。

SQL Server 2016 (13.x) 以降では、インストール時とセットアップ中にサービス アカウントにこのアクセス許可を付与できます。

コマンド プロンプト インストールを使用する場合、/SQLSVCINSTANTFILEINIT 引数を追加するか、インストール ウィザード[SQL Server データベース エンジン サービスにボリューム メンテナンス タスクを実行する特権の付与] のボックスにチェックを入れます。

アカウントに Perform volume maintenance tasks 権限を許可する方法。

  1. データ ファイルを作成するコンピューター上で、ローカル セキュリティ ポリシー アプリケーション (secpol.msc) を開きます。

  2. 左側のペインで [ローカル ポリシー]を展開し、 [ユーザー権利の割り当て]を選択します。

  3. 右側のペインで、[ボリュームの保守タスクを実行]をダブルクリックします。

  4. [ユーザーまたはグループの追加] を選択して、SQL Server サービス アカウントを追加します。

  5. [適用]を選択し、[ローカル セキュリティ ポリシー] ダイアログ ボックスをすべて閉じます。

  6. SQL Server サービスを再起動します。

  7. 起動時に SQL Server エラー ログを確認します。

    適用対象: SQL Server (SQL Server 2012 (11.x) SP4、SQL Server 2014 (12.x) SP2、SQL Server 2016 (13.x) 以降)。

    1. SQL Server サービス開始アカウントに 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.

    2. SQL Server サービスの開始アカウントに 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.

    Note

    SQL Server では、sys.dm_server_services 動的管理ビューの instant_file_initialization_enabled 値を使用して、インスタンスに対してファイルの瞬時初期化が有効になっているかどうかを識別します。

セキュリティに関する考慮事項

メリットがセキュリティ リスクを上回る可能性があるため、ファイルの瞬時初期化を有効にすることを推奨します。

ファイルの瞬時初期化を使用する場合、削除されたディスクの内容は、新しいデータがファイルに書き込まれるときにのみ上書きされます。 そのため、他のデータがデータ ファイルのその特定の領域に書き込まれるまで、削除された内容が許可されていないプリンシパルによってアクセスされる可能性があります。

データベース ファイルが SQL Server のインスタンスにアタッチされている間は、ファイルに対する随意アクセス制御リスト (DACL) により、このような情報漏えいのリスクは軽減されます。 この DACL により、SQL Server サービス アカウントとローカル管理者のみにファイル アクセスが許可されます。 ただし、ファイルがデタッチされると、SE_MANAGE_VOLUME_NAME がないユーザーまたはサービスによってアクセスされる可能性があります。

次の場合にも同じようなことを考慮する必要があります。

  • データベースがバックアップされています。 バックアップ ファイルが適切な DACL で保護されていない場合、許可されていないユーザーやサービスに削除された内容を利用される可能性があります。

  • IFI を使用してファイルが拡張されています。 SQL Server 管理者が未加工のページ コンテンツにアクセスして、以前削除されたコンテンツを表示する可能性があります。

  • データベース ファイルが記憶域ネットワークにホストされています。 記憶域ネットワークで常に新しいページが事前に初期化されているものとして示される可能性もあり、オペレーティング システムがページを初期化することは不要なオーバーヘッドになることがあります。

削除された内容が公開される可能性が懸念される場合は、次のいずれか、または両方の対策を行う必要があります。

  • デタッチされたすべてのデータ ファイルおよびバックアップ ファイルに、常に限定的な DACL が設定されるようにする。

  • SQL Server のインスタンスでデータ ファイルの瞬時初期化を無効にします。 これを行うには、SQL Server サービス開始アカウントから SE_MANAGE_VOLUME_NAME を取り消します。

    Note

    無効化により、データ ファイルの割り当て時間が増加します。これは、ユーザー権限が禁止された後で作成またはサイズ増加されたファイルのみに影響します。

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 の待機の種類が表示されます。