Microsoft? SQL Server? 2000 将数据库映射到一组操作系统文件上。数据和日志信息绝不混合在同一个文件中,而且个别文件只由一个数据库使用。
SQL Server 2000 数据库有三种类型的文件:
主要数据文件
主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。
次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。
日志文件
日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。
SQL Server 2000 不强制使用 .mdf、.ndf 和 .ldf 文件扩展名,但建议使用这些扩展名以帮助标识文件的用途。
在 SQL Server 2000 中,某个数据库中的所有文件的位置都记录在 master 数据库和该数据库的主文件中。大多数情况下,数据库引擎使用 master 数据库中的文件位置信息。不过对于某些操作,数据库引擎使用主文件中的文件位置信息初始化 master 数据库中的文件位置项:
当使用 sp_attach_db 系统存储过程附加数据库时。
当从 SQL Server 7.0 版升级到 SQL Server 2000 时。
当还原 master 数据库时。
SQL Server 2000 文件有两个名称:
logical_file_name 是在所有 Transact-SQL 语句中引用文件时所使用的名称。
逻辑文件名必须遵守 SQL Server 标识符规则,且对数据库必须是唯一的。
os_file_name 是物理文件名。
物理文件名必须遵从 Microsoft Windows NT? 或 Microsoft Windows? 98 和 Microsoft Windows 95 的文件名规则。
下面是在 SQL Server 2000 默认实例上创建的数据库的逻辑文件名和物理文件名示例:
SQL Server 数据和日志文件可以放置在 FAT 或 NTFS 文件系统中,但不能放在压缩文件系统中。
在 SQL Server 2000 中,数据文件的页按顺序编号,文件首页的页码是 0。每个文件都有一个文件 ID 号。在数据库中唯一标识一页需要同时使用文件 ID 和页码。下例显示包含 4-MB 主要数据文件和 1-MB 次要数据文件的数据库中的页码。
在每个文件中,第一页是包含文件特性信息的文件的页首页。在文件开始处的其它几页也包含系统信息(如分配映射表)。系统页存储在主要数据文件和第一个日志文件中,其中有一个是包含数据库属性信息的数据库引导页。
SQL Server 2000 文件可以从它们最初指定的大小自动增长。定义文件时可以指定增量。每次填充文件时,均按这个增量值增加它的大小。如果在文件组中有多个文件,这些文件在全部填满之前不自动增长。填满后,这些文件使用循环算法进行增长。
还可以指定每个文件的最大大小。如果没有指定最大大小,文件可以一直增长到用完磁盘上的所有可用空间。如果 SQL Server 作为数据库嵌入应用程序,而该应用程序的用户无法迅速与系统管理员联系,此功能在这种情况下特别有用。用户可以让文件按需要自动增长,以减轻监视数据库中的可用空间量和手工分配额外空间的管理负担。
如果有多个 SQL Server 实例在单个计算机上运行,则每个实例获得不同的默认目录来存储该实例中创建的数据库文件。
数据库文件组
出于分配和管理目的,可以将数据库文件分成不同的文件组。一些系统可以通过控制在特定磁盘驱动器上放置的数据和索引来提高自身的性能。文件组可以对此进程提供帮助。系统管理员可以为每个磁盘驱动器创建文件组,然后将特定的表、索引、或表中的 text、ntext 或 image 数据指派给特定的文件组。
没有一个文件可以是一个以上文件组的成员。表、索引、以及 text、ntext 和 image 数据可以与文件组相关联,在这种情况下,它们的所有页都将分配在那个文件组中。
日志文件不能作为文件组的一部分。日志空间与数据空间分开管理。
文件组中的文件不自动增长,除非文件组中的文件全都没有可用空间。
有两种类型的文件组:
主要文件组
主文件组包含主要数据文件和任何没有明确指派给其它文件组的其它文件。系统表的所有页均分配在主文件组中。
用户定义文件组
用户定义文件组是在 CREATE DATABASE 或 ALTER DATABASE 语句中,使用 FILEGROUP 关键字指定的文件组。
每个数据库中都有一个文件组作为默认文件组运行。当 SQL Server 给创建时没有为其指定文件组的表或索引分配页时,将从默认文件组中进行分配。一次只能有一个文件组作为默认文件组。db_owner 固定数据库角色成员可以将默认文件组从一个文件组切换到另一个。如果没有指定默认文件组,则主文件组是默认文件组。
SQL Server 2000 在没有文件组时也能有效地工作,因此许多系统不需要指定用户定义文件组。在这种情况下,所有文件都包含在主文件组中,而且 SQL Server 2000 可以在数据库内的任何位置分配数据。文件组不是在多个驱动器之间分配 I/O 的唯一方法。
db_owner 固定数据库角色成员可以备份和还原个别的文件或文件组,而不用备份或还原整个数据库。
下例在 SQL Server 2000 的默认实例上创建数据库。该数据库包括一个主要数据文件、一个用户定义的文件组和一个日志文件。主要数据文件在主文件组中,而用户定义文件组有两个次要数据文件。ALTER DATABASE 语句将用户定义文件组指定为默认文件组。之后,通过指定用户定义的文件组来创建表。
USE master
GO
-- Create the database with the default data
-- filegroup and the log file. Specify the
-- growth increment and the max size for the
-- primary data file.
CREATE DATABASE MyDB
ON PRIMARY
( NAME='MyDB_Primary',
FILE NAME=
'c:Program FilesMicrosoft SQL ServerMSSQLdataMyDB_Prm.mdf',
SIZE=4,
MAXSIZE=10,
FILEGROWTH=1),
FILEGROUP MyDB_FG1
( NAME = 'MyDB_FG1_Dat1',
FILE NAME =
'c:Program FilesMicrosoft SQL ServerMSSQLdataMyDB_FG1_1.ndf',
SIZE = 1MB,
MAXSIZE=10,
FILEGROWTH=1),
( NAME = 'MyDB_FG1_Dat2',
FILE NAME =
'c:Program FilesMicrosoft SQL ServerMSSQLdataMyDB_FG1_2.ndf',
SIZE = 1MB,
MAXSIZE=10,
FILEGROWTH=1)
LOG ON
( NAME='MyDB_log',
FILE NAME =
'c:Program FilesMicrosoft SQL ServerMSSQLdataMyDB.ldf',
SIZE=1,
MAXSIZE=10,
FILEGROWTH=1)
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
可以将用户文件组设成只读,数据不能更改,但可以修改目录以执行权限管理等工作。
SQL Server 2000 数据库可以从服务器中分离出来,然后重新连接到另一台服务器或原来的服务器上。这对制作要分发的、以便用于在客户的本地 SQL Server 安装上使用的数据库特别有用。例如,公司可以创建包含其当前产品目录的数据库。公司可以在可写的光盘驱动器上创建这个数据库,并将它设成只读。然后,他们可以复制这张光盘,给那些在 Windows 95 便携式电脑上安装了目录应用程序和 SQL Server 的地区销售代表发送复本。这样一来,销售代表就有了最新的产品目录信息。