文件和文件组概念

 

关于文件与文件组,简单概括如下,详情请参考官方文档数据库文件和文件组Database Files and Filegroups或更多相关资料:

 

数据文件概念:

 

每个SQL Server数据库至少包含两个作系统文件:一个数据文件(data file)和一个日志文件(log file)。数据文件包含数据和对象,例如表、索引、存储过程和视图....。日志文件包含恢复数据库所需的所有事务的相关数据。其实在SQL Server中,数据文件分为三类,分别为:

 

主数据文件

 

        主数据文件包含数据库的启动信息,并指向数据库中的其他文件。 用户数据和对象可存储在此文件中,也可以存储在辅助数据文件中。每个数据库有一个主要数据文件。 

        主要数据文件的建议文件扩展名是 .mdf。

 

辅助数据文件

 

        辅助数据文件是可选的,由用户定义并存储用户数据。 通过将每个文件放在不同的磁盘驱动器上,辅助数据文件可用于将数据分散到多个磁盘上。 

        另外,如果数据库超过了单个 Windows 文件的最大大小,可以使用次要数据文件,这样数据库就能继续增长。

        辅助数据文件的建议文件扩展名是 .ndf。

 

    事务日志文件

        事务日志文件保存用于恢复数据库的日志信息。 每个数据库必须至少有一个日志文件。 事务日志的建议文件扩展名是 .ldf。

 

 

 

    注意:虽然文件的扩展名是可以修改的,但强烈建议不要去改扩展名。

 

 

文件组概念:

 

文件组(File Group),简单来说,就是数据文件的组合。为了便于分配和管理,可以将数据文件集合起来,放到文件组中。每个数据库有一个主要文件组(Primary File Group),这个是默认的。 此文件组包含主要数据文件和未放入其他文件组的所有次要文件。 可以创建用户定义的文件组,用于将数据文件集合起来,以便于管理、数据分配和放置。总体来说,文件组是一个逻辑概念,类似于Oracle数据库的表空间,文件组与文件的关系就类似于ORACLE中表空间与文件的概念。

 

文件组分类:

 

        主文件组(Primary)

        内存优化数据文件组(Memory Optimized Data)

        Filestream 文件组(Filestream)

        用户自定义文件组(User-defined)

 

注意事项:PRIMARY 文件组是默认文件组,除非使用 ALTER DATABASE 语句进行了修改。另外,即使指定其它文件组为默认文件组。但系统对象和表仍然分配给 PRIMARY 文件组,而不是新的默认文件组。

   

 

 

文件组的优缺点

 

 文件组是逻辑概念,一个文件组对应一个或多个文件。创建表的时候指定文件组即可(默认,指定PRIMARY文件组),这样可以隔离用户对文件的依赖,耦合性就要低很多。另外,使用多个文件组和文件不仅仅是为了分散IO和提高性能,还有高可用性方面的原因。有关一个数据库应该包含几个文件或文件组[下面部分内容来自SQL Server中数据库文件的存放方式,文件和文件组]

 

  数据库中使用多个文件或文件组在高可用性方面的好处包括:

·         某文件的IO损坏,数据库还可以保证部分在线。

·         将索引和表分开存放,假如索引文件不在线,数据依然可以被访问。

·         历史数据和热数据分开,历史归档数据损坏,不影响热数据。

·         分开数据文件使得在灾难恢复时仅仅恢复部分数据从而缩短了宕机时间

·         数据库分为多个文件使得可以通过增加文件或移动文件的方式解决空间不足的问题

 

 

 从用户的角度来说,创建对象时需要指定存储文件组的只有三种数据对象:表,索引和大对象(LOB)

  

  使用文件组可以隔离用户对文件的依赖,使得用户仅仅针对文件组来建立表和索引,而不用关心实际磁盘中的文件的情况。当文件移动或修改时,由于用户建立的表和索引是建立在文件组上的,并不依赖具体文件,因此SQL Server可以放心的管理文件。

 

  另外,使用文件组的方式来管理文件,可以使得同一文件组内的文件分布在不同的硬盘中,能够大大提供IO性能。

 

  SQL Server根据每个文件设置的初始大小和增量值自动分配新加入的空间,假设在同一文件A设置的大小为文件B的两倍,新增一个数据占用3页,则按比例将2页分配到文件A中,1页分配到文件B

 

 

 

新增文件组

 

如下所示,创建两个文件组,DB_Data_Groups用来存放数据(聚集索引),DB_Index_Groups用来存放索引(非聚集索引)

 

 

--创建文件组DB_Index_Groups
USE [master]
GO
ALTER DATABASE [YourSQLDb] ADD FILEGROUP [DB_Index_Groups]
GO
 
--创建文件组DB_Data_Groups
USE [master]
GO
ALTER DATABASE [YourSQLDb] ADD FILEGROUP [DB_Data_Groups]
GO
 
 
--向文件组新增文件
USE [master];
GO
ALTER DATABASE [YourSQLDb] ADD FILE ( NAME = N'YourSQLDb_IND_01', FILENAME = N'D:\SQL_DATA\YourSQLDb_IND_01.ndf' , SIZE = 16GB , FILEGROWTH = 256MB ) TO FILEGROUP [DB_Index_Groups];
GO
ALTER DATABASE [YourSQLDb] ADD FILE ( NAME = N'YourSQLDb_IND_02', FILENAME = N'E:\SQL_DATA\YourSQLDb_IND_02.ndf' , SIZE = 16GB , FILEGROWTH = 256MB ) TO FILEGROUP [DB_Index_Groups];
GO
ALTER DATABASE [YourSQLDb] ADD FILE ( NAME = N'YourSQLDb_IND_03', FILENAME = N'F:\SQL_DATA\YourSQLDb_IND_03.ndf' , SIZE = 16GB , FILEGROWTH = 256MB ) TO FILEGROUP [DB_Index_Groups];
GO
ALTER DATABASE [YourSQLDb] ADD FILE ( NAME = N'YourSQLDb_IND_04', FILENAME = N'G:\SQL_DATA\YourSQLDb_IND_04.ndf' , SIZE = 16GB , FILEGROWTH = 256MB ) TO FILEGROUP [DB_Index_Groups];
GO
 
USE [master];
GO
ALTER DATABASE [YourSQLDb] ADD FILE ( NAME = N'YourSQLDb_DATA_01', FILENAME = N'D:\SQL_DATA\YourSQLDb_DATA_01.ndf' , SIZE = 26GB , FILEGROWTH = 256MB ) TO FILEGROUP [DB_Data_Groups];
GO
ALTER DATABASE [YourSQLDb] ADD FILE ( NAME = N'YourSQLDb_DATA_02', FILENAME = N'E:\SQL_DATA\YourSQLDb_DATA_02.ndf' , SIZE = 26GB , FILEGROWTH = 256MB ) TO FILEGROUP [DB_Data_Groups];
GO
ALTER DATABASE [YourSQLDb] ADD FILE ( NAME = N'YourSQLDb_DATA_03', FILENAME = N'F:\SQL_DATA\YourSQLDb_DATA_03.ndf' , SIZE = 26GB , FILEGROWTH = 256MB ) TO FILEGROUP [DB_Data_Groups];
GO
ALTER DATABASE [YourSQLDb] ADD FILE ( NAME = N'YourSQLDb_DATA_04', FILENAME = N'G:\SQL_DATA\YourSQLDb_DATA_04.ndf' , SIZE = 26GB , FILEGROWTH = 256MB ) TO FILEGROUP [DB_Data_Groups];
GO
 
 

相关文章: