本文主要来源于Microsoft《SQL Server 2008 R2联机丛书》。转裁请注明出处。
SQL Server 将数据库映射为一组操作系统文件。数据和日志信息绝不会混合在同一个文件中,而且一个文件只由一个数据库使用。文件组是命名的文件集合,用于帮助数据布局和管理任务,例如备份和还原操作。
一、数据库文件
SQL Server 数据库具有三种类型的文件:
主数据文件。主数据文件是数据库的起点,指向数据库中的其他文件。每个数据库都有一个主数据文件。主数据文件的推荐文件扩展名是 .mdf。
次要数据文件。除主数据文件以外的所有其他数据文件都是次要数据文件。某些数据库可能不含有任何次要数据文件,而有些数据库则含有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。
日志文件。日志文件包含着用于恢复数据库的所有日志信息。每个数据库必须至少有一个日志文件,当然也可以有多个。日志文件的推荐文件扩展名是 .ldf。
SQL Server 不强制使用 .mdf、.ndf 和 .ldf 文件扩展名,但使用它们有助于标识文件的各种类型和用途。
在 SQL Server 中,数据库中所有文件的位置都记录在数据库的主文件和 master 数据库中。大多数情况下,SQL Server 数据库引擎使用 master 数据库中的文件位置信息。
二、逻辑和物理文件名称
SQL Server 文件有两个名称:
logical_file_name 。logical_file_name 是在所有 Transact-SQL 语句中引用物理文件时所使用的名称。逻辑文件名必须符合 SQL Server 标识符规则,而且在数据库中的逻辑文件名中必须是唯一的。
os_file_name 。os_file_name 是包括目录路径的物理文件名。它必须符合操作系统文件命名规则。
如果多个 SQL Server 实例在一台计算机上运行,则每个实例都会接收到不同的默认目录来保存在该实例中创建的数据库文件。
三、数据库快照文件
数据库快照存储其“写入时复制”数据时所用的文件格式取决于快照是由用户创建,还是在内部使用。
用户创建的数据库快照将其数据存储在一个或多个稀疏文件中。稀疏文件技术是 NTFS 文件系统的一项功能。首先,稀疏文件不包含任何用户数据,并且没有为稀疏文件分配用于用户数据的磁盘空间。
下图说明了写入时复制操作。快照关系图中的浅灰色方框表示稀疏文件中尚未分配的潜在空间。收到源数据库中页的第一次更新时,数据库引擎将写入文件,操作系统向快照的稀疏文件分配空间并将原始页复制到该处。然后,数据库引擎更新源数据库中的页。下图说明了此类写入时复制操作。
更新页之后,对快照的读操作仍访问原始页,该原始页现在存储在稀疏文件中。下图说明了对访问源数据库中更新页的快照的读操作。此读操作从快照的稀疏文件中读取原始页。
四、数据库文件组
为便于分配和管理,可以将数据库对象和文件一起分成文件组。有两种类型的文件组:
主文件组。主文件组包含主数据文件和任何没有明确分配给其他文件组的其他文件。系统表的所有页均分配在主文件组中。
用户定义文件组。用户定义文件组是通过在 CREATE DATABASE 或 ALTER DATABASE 语句中使用 FILEGROUP 关键字指定的任何文件组。
日志文件不包括在文件组内。日志空间与数据空间分开管理。
一个文件不可以是多个文件组的成员。表、索引和大型对象数据可以与指定的文件组相关联。在这种情况下,它们的所有页将被分配到该文件组,或者对表和索引进行分区。已分区表和索引的数据被分割为单元,每个单元可以放置在数据库中的单独文件组中。
每个数据库中均有一个文件组被指定为默认文件组。如果创建表或索引时未指定文件组,则将假定所有页都从默认文件组分配。一次只能有一个文件组作为默认文件组。db_owner 固定数据库角色成员可以将默认文件组从一个文件组切换到另一个。如果没有指定默认文件组,则将主文件组作为默认文件组。
五、文件和文件组示例
以下示例在 SQL Server 实例上创建了一个数据库。该数据库包括一个主数据文件、一个用户定义文件组和一个日志文件。主数据文件在主文件组中,而用户定义文件组包含两个次要数据文件。