1.4 数据库文件
1.4.1 主要的文件类型
SQL Server 主要使用以下3类文件。
(1)主数据文件
主数据文件的默认扩展名是 mdf。这个文件是必需的,而且只能有一个。在这个文件中还包含了其他几个文件的位置等信息,还包含了该数据库中的所有系统表。
默认情况下,主数据文件属于 PRIMARY 文件组。
(2)辅助数据文件
辅助数据文件的默认扩展名是 ndf。辅助数据文件的数量没有限制,可以任意创建多个。
(3)日志文件
日志文件的默认扩展名是 ldf。日志文件用来存放 SQL Server 的事务日志。
上述3类文件的扩展名可以随意修改,但是推荐使用默认的扩展名。
可以通过 sys.database_files 系统视图查看当前数据库使用的文件情况。
1.4.2 使用多个数据文件
一个数据文件只能属于一个文件组。一个文件组可以拥有多个数据文件。
文件组对组内的所有文件都使用按比例填充策略。当数据写入文件组时,数据库引擎按文件中的可用空间比例将数据写入文件组中的每个文件,类似于负载均衡的效果。例如,某个文件组有3个数据文件,他们的可用空间分别为 1GB、2GB 和 3GB,如果往这个文件组里写入 600MB 数据,则分别向3个文件写入100MB、200MB 和 300MB。如果这些物理文件分布在不同的物理硬盘上,则可以提高数据库引擎的 I/O 性能。
文件和文件组还允许数据布局,因为可以在特定的文件组中创建表。这样可以改善性能,因为可以将特定表的所有 I/O 都定向到一个特定的磁盘。
例如,可以将最常用的表放在一个文件组的一个文件中,该文件组位于一个磁盘上;而将数据库中其他不常访问的表放在另一个文件组的其他文件中,该文件组位于第二个磁盘上。
1.4.3 添加数据文件
打开数据库的属性窗口,选择“文件”选项卡,单击“添加”按钮,即可添加数据文件。
使用脚本如下:
USE [master] GO ALTER DATABASE [SQLDB01] ADD FILE ( NAME = N'FG2012_data', FILENAME = N'C:\MSSQL\Data\FG2012_data.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG2012] GO ALTER DATABASE [SQLDB01] ADD FILE ( NAME = N'FG2013_data', FILENAME = N'C:\MSSQL\Data\FG2013_data.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG2013] GO ALTER DATABASE [SQLDB01] ADD FILE ( NAME = N'FG2014_data', FILENAME = N'C:\MSSQL\Data\FG2014_data.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG2014] GO |
数据库文件具有以下属性。
(1)逻辑名称
输入或修改文件的逻辑名称。它必须符合 SQL Server 标识符规则,而且必须是唯一的名称。。
SQL Server 的语句不能直接引用物理文件,而是引用逻辑名称。
(2)文件类型
从列表中选择一种文件类型。文件类型可以为“行数据”、“日志”或“FILESTREAM 数据”。
不可以修改现有文件的文件类型。
(3)文件组
从列表中为文件选择文件组。默认情况下,为默认的文件组。不可以修改现有文件的文件组。
也可以从下拉列表中选择“新文件组”,然后在新建文件组的窗口创建新的文件组。
(4)初始大小
输入或修改文件的初始大小,单位为 MB。默认情况下,这是 model 数据库的初始大小。
此属性对于 FILESTREAM 文件无效。
(5)自动增长/最大大小
选择或显示文件的自动增长属性。这些属性控制在达到文件的最大文件大小时文件的扩展方式。默认情况下,它们是 model 数据库的值。
如数据库文件已经填满而没有可用空间,那么只有为数据库添加更多的文件或扩展现有的文件后,才能添加有新的可用空间,否则数据库可能遇到“数据库已满”或“日志已满”的错误。
(6)路径
显示所选文件的路径。默认情况下,这是服务器的属性窗口中“数据库设置”指定的数据库默认位置。
对于 FILESTREAM 文件,该路径是一个文件夹。SQL Server 数据库引擎将在此文件夹中创建基础文件。
(7)文件名
显示文件的名称。默认情况下,此处为空,系统将在稍后创建物理文件时使用逻辑名称加上默认的扩展名作为物理文件的名称。
此字段对于 FILESTREAM 文件无效。
提示:
不建议为事务日志创建多个文件,这可能会带来性能问题,并将增加恢复数据库的难度。
在创建数据库时,请根据数据库中短期预计的最大数据量,创建尽可能大的数据文件。但是,过大的数据文件会导致在将其恢复到其他实例时需要同样多的磁盘空间。例如,数据文件为 100GB,即使此时其中已经使用了的空间非常少,在恢复到另一个实例时数据文件仍然需要 100GB 磁盘空间。
1.4.4 文件自动增长
如果将数据库设置为自动增长,则当文件组中的所有文件填满后,数据库引擎便会采用循环方式一次自动扩展一个文件以容纳更多数据。例如,某个文件组由三个文件组成,它们都设置为自动增长。当文件组中所有文件的空间都已用完时,只扩展第一个文件。当第一个文件已满,无法再向文件组中写入更多数据时,将扩展第二个文件。当第二个文件已满,无法再向文件组中写入更多数据时,将扩展第三个文件。当第三个文件已满,无法再向文件组中写入更多数据时,将再次扩展第一个文件,依此类推。
单击“自动增长/最大大小”列旁边的编辑按钮,为数据文件配置自动增长和最大文件大小选项。
使用脚本示例如下:
USE [master] GO ALTER DATABASE [SQLDB01] MODIFY FILE ( NAME = N'SQLDB01', MAXSIZE = UNLIMITED, FILEGROWTH = 2048KB ) GO ALTER DATABASE [SQLDB01] MODIFY FILE ( NAME = N'SQLDB01_log', MAXSIZE = 204800KB , FILEGROWTH = 20%) GO |
最佳实践:
建议长期监视数据库的自动增长情况和磁盘的剩余空间情况,以合理配置上述选项。如果禁用了“启用自动增长”或者限制了最大文件大小,请务必监视数据库的可用空间情况,以免发生“数据库已满”或“数据库日志文件已满”的错误。如果不限制最大文件大小,请务必监视磁盘的剩余空间情况。
如果文件增长是按百分比设置,建议其绝对值不低于7天的增长量。例如,数据库每天增长 100MB,则确保按百分比计算的结果不低于 700MB。或者以 MB 为单位进行设置。
在自动增长时,数据库需要向 Windows 申请磁盘空间,以及对页和区的分配进行管理。在此期间可能会对数据库引擎的性能造成一定的影响,因此应当尽量避免在业务高峰期发生自动增长的情形。建议根据长期监视获得的数据库增长规律,通过创建作业和计划从而在业务空闲时间手动增加“初始大小”的值。
1.4.5 即时文件初始化
在创建新数据库、添加数据库文件、增大数据文件(包括自动增长操作)、还原数据库时,操作系统需要初始化数据库文件,以零填充所分配的磁盘空间。文件初始化会导致这些操作花费更多的时间。
Windows XP 和 Windows Server 2003 或更高版本中允许 SQL Server 执行即时文件初始化(Instant File Initialization,缩写为IFI)。由于不需要第一次以零填充空间,可以瞬间对数据文件完成初始化。
为了启用即时文件初始化,需要将 SQL Server 服务的启动帐户添加到执行卷维护任务(Perform Volume Maintenance Tasks)安全策略中为其授予权限。
即时文件初始化仅适用于数据文件,不适用于日志文件。如果数据库启用了TDE(透明数据加密),即时文件初始化功能不可用。
本文出自 “SQLServer2014丛书” 博客,谢绝转载!