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

適用対象:SQL Server

この記事では、ファイルの瞬時初期化と、それを有効にして SQL Server データベース ファイルの拡張を高速化する方法について説明します。

デフォルトでは、データおよびログ ファイルの初期化は、ディスクに以前削除したファイルのデータが残っている場合にそれを上書きするために行います。 次の操作を実行すると、データとログ ファイルは、まずファイルのゼロイング (ゼロを書き込む処理) で初期化されます。

  • データベースを作成します。
  • 既存のデータベースへのデータ ファイルまたはログ ファイルの追加。
  • 既存のファイルのサイズを大きくする (自動拡張操作を含む)。
  • データベースまたはファイル グループの復元。

SQL Serverでは、データ ファイルの場合のみ、ファイルの瞬時初期化 (IFI) を使用すると、前述のファイル操作をより高速に実行できます。これは、その領域をゼロで埋め込まずに使用されたディスク領域を再利用するためです。 代わりに、新しいデータがファイルに書き込まれるときに、ディスクの内容が上書きされます。

トランザクション ログ ファイルを瞬時に初期化することはできませんが、SQL Server 2022 (16.x) 以降では、ファイルの瞬時初期化によって、トランザクション ログの自動拡張イベントが最大 64 MB のメリットを得ることができます。 新しいデータベースの既定の自動拡張サイズの拡張は 64 MB です。 64 MB を超えるトランザクション ログ ファイルの自動拡張イベントについては、ファイルの瞬時初期化の恩恵を得ることができません。

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

ファイルの瞬時初期化は、SQL Server サービスのスタートアップ アカウントにSE_MANAGE_VOLUME_NAMEが付与されている場合にのみ使用できます。 Windows Administrator グループのメンバーにはこの権限があり、他のユーザーを ボリュームの保守タスクを実行 セキュリティ ポリシーに追加することにより、これらのユーザーにこの権限を許可することができます。

重要

Transparent Data Encryption (TDE) など、ファイルの瞬時初期化を使用できない機能の使用状況もあります。

注意

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.

    注意

    sys.dm_server_services DMV の 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を取り消します。

    注意

    を無効にすると、データ ファイルの割り当て時間が長くなり、ユーザー権限が取り消された後に作成またはサイズが増えたファイルにのみ影響します。

SE_MANAGE_VOLUME_NAME ユーザー権限

SE_MANAGE_VOLUME_NAME ユーザー特権は、Windows 管理ツールローカル セキュリティ ポリシー アプレットで割り当てることができます。 [ローカル ポリシー][User Right Assignment] \(ユーザー権限の割り当て\) を選択し、 [ボリュームの保守タスクを実行] プロパティを変更します。

パフォーマンスに関する考慮事項

データベース ファイルの初期化プロセスでは、初期化中にファイルの新しい領域にゼロが書き込まれます。 このプロセスの期間は、初期化されるファイル部分のサイズと、ストレージ・システムの応答時間と容量によって異なります。 初期化に時間がかかる場合は、SQL Server Errorlog とアプリケーション ログに次のメッセージが記録されている可能性があります。

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表示されます。

参照

CREATE DATABASE (SQL Server Transact-SQL)