ファイルとファイル グループのアーキテクチャ

SQL Server は、一連のオペレーティング システム ファイルにデータベースをマップします。データとログ情報が同じファイル内に混在することは決してなく、個々のファイルは 1 つのデータベースだけで使用されます。ファイル グループとは、ファイルのコレクションに名前を付けたものであり、バックアップ操作や復元操作など、データ配置や管理タスクに役立ちます。

データベース ファイル

SQL Server データベースには 3 種類のファイルがあります。

  • プライマリ データ ファイル

    プライマリ データ ファイルはデータベースの開始点であり、データベース内の他のファイルを指し示します。各データベースには 1 つのプライマリ データ ファイルがあります。プライマリ データ ファイルに推奨されるファイル名拡張子は .mdf です。

  • セカンダリ データ ファイル

    セカンダリ データ ファイルは、プライマリ データ ファイル以外のすべてのデータ ファイルで構成されます。データベースによっては、セカンダリ データ ファイルがない場合と、複数のセカンダリ データ ファイルがある場合があります。セカンダリ データ ファイルに推奨されるファイル名拡張子は .ndf です。

  • ログ ファイル

    ログ ファイルには、データベースの復旧に使用するすべてのログ情報が格納されます。1 つのデータベースには最低 1 つのログ ファイルが必要で、複数あってもかまいません。ログ ファイルに推奨されるファイル名拡張子は .ldf です。

SQL Server では、ファイル名拡張子に必ずしも .mdf、.ndf、および .ldf を使用する必要はありませんが、これらの拡張子は、ファイルの種類とその用途の特定に役立ちます。

SQL Server では、データベース内のすべてのファイルの場所が、そのデータベースのプライマリ ファイルと master データベースに記録されます。通常、SQL Server データベース エンジンでは、master データベースにあるファイルの場所情報が使用されます。ただし、次の場合には、データベース エンジンがプライマリ ファイルにあるファイルの場所情報を使用して、master データベースのファイルの場所エントリを初期化します。

  • CREATE DATABASE ステートメントで FOR ATTACH オプションまたは FOR ATTACH_REBUILD_LOG オプションのいずれかを指定してデータベースをアタッチする場合。

  • SQL Server 2000 または 7.0 のバージョンからアップグレードする場合。

  • master データベースを復元する場合。

論理ファイル名と物理ファイル名

SQL Server のファイルには、それぞれ 2 つの名前があります。

logical_file_name

logical_file_name は、すべての Transact-SQL ステートメントで物理ファイルを参照するために使用する名前です。論理ファイル名は、SQL Server の識別子の規則に従っている必要があります。また、データベース内の論理ファイル名は互いに一意にする必要があります。

os_file_name

os_file_name はディレクトリ パスを含む物理ファイルの名前です。この名前はオペレーティング システムのファイル名の規則に従っている必要があります。

SQL Server のデータとログ ファイルは、FAT または NTFS のいずれかのファイル システムに配置できます。NTFS のセキュリティの方が強力なので、NTFS ファイル システムを使用することをお勧めします。読み書き可能なデータ ファイル グループとログ ファイルは、圧縮された NTFS ファイル システムに配置できません。圧縮された NTFS ファイル システムに配置できるのは、読み取り専用データベースと読み取り専用セカンダリ ファイル グループだけです。詳細については、「読み取り専用のファイル グループと圧縮」を参照してください。

1 台のコンピューターで SQL Server の複数のインスタンスを実行すると、インスタンスごとに異なる既定のディレクトリが与えられ、そのインスタンスで作成したデータベースのファイルがその既定のディレクトリで保持されます。詳細については、「SQL Server の既定のインスタンスおよび名前付きインスタンスのファイルの場所」を参照してください。

データ ファイルのページ

SQL Server データ ファイルのページには、ファイル内の最初のページを 0 として、順に番号が付けられています。データベース内の各ファイルには一意のファイル ID 番号が付けられています。データベース内のページを一意に識別するには、ファイル ID とページ番号の両方が必要です。次の例は、4 MB のプライマリ データ ファイルと 1 MB のセカンダリ データ ファイルがあるデータベースのページ番号を示しています。

2 つのデータ ファイルの連続したページ番号

各ファイルの 1 ページ目はファイル ヘッダー ページで、そのファイルの属性に関する情報が格納されています。また、ファイルの先頭にある数ページには、アロケーション マップなどのシステム情報が格納されています。プライマリ データ ファイルと最初のログ ファイルの両方に格納されているシステム ページの 1 つは、データベースの属性情報が格納されているデータベース ブート ページです。ページとページの種類の詳細については、「ページとエクステントについて」を参照してください。

ファイル サイズ

SQL Server のファイルは、最初に指定したサイズから自動拡張するように設定できます。ファイルを定義するときに、拡張の増分値を指定できます。ファイルの空き容量がなくなるたびに、ファイルのサイズは指定した増分値だけ拡張されます。ファイル グループに複数のファイルが存在する場合、すべてのファイルの空き容量がなくなるまで、ファイル グループ内のファイルは自動拡張しません。すべてのファイルに空き容量がなくなると、ラウンド ロビン方式で拡張されます。

各ファイルに最大サイズを指定することもできます。最大サイズを指定しなかった場合、ファイルはディスクの空き領域を使い果たすまで拡張し続けます。この機能は、ユーザーがシステム管理者と簡単に連絡を取れない状況にあり、SQL Server をアプリケーションに埋め込んだデータベースとして使用している場合に特に便利です。ユーザーは、必要に応じてファイルを自動拡張するようにし、データベースの空き領域の監視や追加領域を手動で割り当てる管理上の負担を軽減できます。

データベース スナップショット ファイル

スナップショットがユーザーによって作成されるか、内部的に使用されるかに応じて、copy-on-write (書き込まれるたびにコピー) のデータを保存するためにデータベース スナップショットで使用されるファイル形式が決まります。

  • ユーザーによって作成されるデータベース スナップショットでは、1 つまたは複数のスパース ファイルにデータを保存します。スパース ファイル技術は NTFS ファイル システムの機能です。初期状態のスパース ファイルにはユーザー データが含まれておらず、ユーザー データ用のディスク領域も割り当てられていません。データベース スナップショットでのスパース ファイルの使用方法と、データベース スナップショットがどのように拡張されるかについては、「データベース スナップショットの機能」と「データベース スナップショットのスパース ファイルのサイズについて」を参照してください。

  • データベース スナップショットは特定の DBCC コマンドによって内部的に使用されます。このようなコマンドには、DBCC CHECKDB、DBCC CHECKTABLE、DBCC CHECKALLOC、DBCC CHECKFILEGROUP などがあります。内部データベース スナップショットでは、元のデータベース ファイルのスパース代替データ ストリームを使用します。スパース ファイル同様、代替データ ストリームも NTFS ファイル システムの機能です。スパース代替データ ストリームを使用すると、ファイル サイズやボリューム統計に影響を与えることなく、複数のデータ割り当てを単一のファイルまたはフォルダーに関連付けることができます。

データベース ファイル グループ

データベース オブジェクトとファイルは、割り当てと管理の目的でファイル グループにまとめることができます。ファイル グループには、次の 2 種類があります。

プライマリ

プライマリ ファイル グループには、プライマリ データ ファイルと、他のファイル グループに割り当てられていないファイルが含まれます。システム テーブル用のすべてのページがプライマリ ファイル グループ内で割り当てられています。

ユーザー定義

ユーザー定義のファイル グループは、CREATE DATABASE ステートメントまたは ALTER DATABASE ステートメントで FILEGROUP キーワードを使用して指定されたファイル グループです。

ログ ファイルはファイル グループのメンバーにはなりません。ログ領域はデータ領域とは別に管理されます。

1 つのファイルを複数のファイル グループのメンバーにすることはできません。テーブル、インデックス、およびラージ オブジェクト データを指定のファイル グループに関連付けることができます。その場合、関連付けられたファイル グループ内でそれらのすべてのページが割り当てられます。または、テーブルとインデックスをパーティション分割できます。パーティション テーブルとパーティション インデックスの各データは、データベース内の別個のファイル グループに配置できる単位に分割されます。パーティション テーブルとパーティション インデックスの詳細については、「パーティション テーブルとパーティション インデックス」を参照してください。

各データベースの 1 つのファイル グループは、既定のファイル グループとして指定されます。テーブルまたはインデックスをファイル グループを指定せずに作成すると、すべてのページが既定のファイル グループから割り当てられます。既定のファイル グループにできるファイル グループは 1 つだけです。db_owner 固定データベース ロールのメンバーは、既定のファイル グループをあるファイル グループから別のファイル グループに切り替えることができます。既定のファイル グループが指定されなかった場合、プライマリ ファイル グループが既定のファイル グループになります。

ファイルおよびファイル グループの例

次の例では、SQL Server のインスタンスにデータベースを作成します。このデータベースにはプライマリ データ ファイル、ユーザー定義のファイル グループ、およびログ ファイルが含まれます。プライマリ データ ファイルはプライマリ ファイル グループ内にあり、ユーザー定義ファイル グループには 2 つのセカンダリ データ ファイルがあります。ALTER DATABASE ステートメントにより、このユーザー定義のファイル グループは既定のファイル グループになります。その後、ユーザー定義のファイル グループを指定してテーブルを作成します。

USE master;
GO
-- Create the database with the default data
-- filegroup and a log file. Specify the
-- growth increment and the max size for the
-- primary data file.
CREATE DATABASE MyDB
ON PRIMARY
  ( NAME='MyDB_Primary',
    FILENAME=
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB_Prm.mdf',
    SIZE=4MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB),
FILEGROUP MyDB_FG1
  ( NAME = 'MyDB_FG1_Dat1',
    FILENAME =
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB_FG1_1.ndf',
    SIZE = 1MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB),
  ( NAME = 'MyDB_FG1_Dat2',
    FILENAME =
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB_FG1_2.ndf',
    SIZE = 1MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB)
LOG ON
  ( NAME='MyDB_log',
    FILENAME =
       'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\data\MyDB.ldf',
    SIZE=1MB,
    MAXSIZE=10MB,
    FILEGROWTH=1MB);
GO
ALTER DATABASE MyDB 
  MODIFY FILEGROUP MyDB_FG1 DEFAULT;
GO

-- Create a table in the user-defined filegroup.
USE MyDB;
CREATE TABLE MyTable
  ( cola int PRIMARY KEY,
    colb char(8) )
ON MyDB_FG1;
GO

次の図は、上の例を結果をまとめたものです。

データベースの論理ファイル名と物理ファイル名