概述:sql server是以文件形式存储数据与日志

1.数据文件

  sql server数据文件分为2类

  (1)主数据库文件

  主数据库文件包含数据库的启动信息、系统对象,并指向数据库的其他文件(从数据文件),主数据文件也可以存用户数据和对象。每个数据库必须且只能有一个主数据文件,其后缀名为.mdf。

  (2)从数据文件

  由用户自定义而成,用户存储用户数据与对象,其后缀名为.ndf.

  (3)文件组的概念

  分为2类

  【1】主文件组

  主文件组的名称是primary,它包含主要文件,以及未放入用户定义文件组的任何次要文件,所有系统表都会被分配到主文件组中,如果不指定文件组,默认也是放入主文件组中。

  默认文件组可以通过Alter database语句设置为primary之外的文件组,但是任何时候一个数据库都只能有一个默认文件组。

  【2】用户定义文件组

  用户定义文件组由用户在首次创建数据库时创建,或者是数据库创建后,通过修改数据库的方式创建。

  sql server数据库中读取和存储数据时,不以数据文件为单位,而是以文件组为单位进行操作。数据库中的每个对象都存储在某个文件组上(而不是数据库文件上),每个文件组包含至少一个数据文件。

  使用文件组而不是数据文件的好处在于:可以简化管理,增加可管理的数据文件的数目;逻辑上管理好数据库文件的分部与使用;另一方面可以突破系统的一些限制,例如:两个可用于存储数据的磁盘,但他们的大小都不足以存储整个数据库,则可以在两个磁盘上各建立一个数据文件,并加入到同一个文件组中,这样就可以同时使用2个磁盘的空间。

  使用多个文件的好处

  在大多数情况下,小型的数据库并不需要创建多个文件来存放数据。但是随着数据的增长,单个文件的弊端就会出现。

  •   首先,使用多个文件分布到不同的磁盘分区(多个硬盘)能够几大提高IO性能。
  •   其次,多个文件对于数据比较多的数据库来说,备份和恢复都会方便。
  •   但是,多文件需要占用更多的磁盘空间,因为每个文件中都有自己的一套B树组织方式和自己的增长空间。当然也有自己的碎片。
  •   总体来说,多个文件带来的优点是远远大于弊端的。

实例演示

如何创建多文件与文件组?

--1.用创建数据库的方式创建文件与文件组
-- Create a new database
CREATE DATABASE MultipleFileGroups ON PRIMARY
(
-- Primary File Group
NAME = 'MultipleFileGroups',
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups.mdf',
SIZE = 5MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024KB
),
-- Secondary File Group
FILEGROUP FileGroup1
(
-- 1st file in the first secondary File Group
NAME = 'MultipleFileGroups1',
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups1.ndf',
SIZE = 1MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024KB
),
(
-- 2nd file in the first secondary File Group
NAME = 'MultipleFileGroups2',
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups2.ndf',
SIZE = 1MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024KB
)
LOG ON
(
-- Log File
NAME = 'MultipleFileGroups_Log',
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups.ldf',
SIZE = 5MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024KB
)
GO
 --2.创建文件组
ALTER DATABASE [Test]
ADD FILEGROUP [FG_Test_Id_01] ALTER DATABASE [Test]
ADD FILEGROUP [FG_Test_Id_02]
 --3.创建文件
ALTER DATABASE [Test]
ADD FILE
(NAME = N'FG_TestUnique_Id_01_data',FILENAME = N'E:\FG_TestUnique_Id_01_data.ndf',SIZE = 1MB, FILEGROWTH = 1MB )
TO FILEGROUP [FG_Test_Id_01]; ALTER DATABASE [Test]
ADD FILE
(NAME = N'FG_TestUnique_Id_02_data',FILENAME = N'E:\FG_TestUnique_Id_02_data.ndf',SIZE = 1MB, FILEGROWTH = 1MB )
TO FILEGROUP [FG_Test_Id_02];

如何把表或索引放到特定的文件组?如何把现有表转移到另外的文件/文件组?

  1. --测试库 test
  2. --测试表 t
  3. --测试表主键 id ( PK_t )
  4. --文件组有 primary,data
  5. --希望将 t 的文件组由 primary 改成 data
  6. USE test
  7. GO
  8. ALTER TABLE t DROP CONSTRAINT PK_t
  9. GO
  10. ALTER TABLE t ADD CONSTRAINT PK_t PRIMARY KEY CLUSTERED (ID) ON [data]
  11. GO
  12. --此时表对应的文件组已由 primary 改成了 data
  13. --创建基于文件组 data 的表
  14. IF OBJECT_ID('t2') IS NOT NULL DROP TABLE t2
  15. GO
  16. CREATE TABLE t2(id INT) ON [data]

如何标记特定文件组为默认文件组?

-- FileGroup1 gets the default filegroup, where new database objects
-- will be created
ALTER DATABASE MultipleFileGroups MODIFY FILEGROUP FileGroup1 DEFAULT
GO

这是我通常推荐的方法,因为你不需要再考虑,在创建完你的数据库对象后。因此现在让我们创建一个新的表,它会自动存储在FileGroup1文件组。

-- The table will be created in the file group "FileGroup1"
CREATE TABLE Test
(
Filler CHAR(8000)
)
GO

现在我们进行简单的测试:我们插入40000条记录到表。每条记录8K大小。因此我们插入了320MB数据到表。这是我刚才提的轮询调度分配算法,会进行操作:SQL Server会在2个文件间发放数据:第一个文件有160M的数据,第二个文件也会有160M的数据。

-- Insert 40.000 records, results in about 312MB data (40.000 x 8KB / 1024 = 312,5MB)
-- They are distributed in a round-robin fashion between the files in the file group "FileGroup1"
-- Each file will get about 160MB
DECLARE @i INT = 1
WHILE (@i <= 40000)
BEGIN
INSERT INTO Test VALUES
(
REPLICATE('x', 8000)
) SET @i += 1
END
GO

接下来你可以在硬盘上看下,你会看到2个文件时同样的大小。

当你把这些文件放在不同的物理硬盘上,你可以同时访问它们。那就是在一个文件组里有多个文件的强大。

你也可以使用下列脚本获取数据库文件的相关信息。

-- Retrieve file statistics information about the created database files
DECLARE @dbId INT
SELECT @dbId = database_id FROM sys.databases WHERE name = 'MultipleFileGroups' SELECT
sys.database_files.type_desc,
sys.database_files.physical_name,
sys.dm_io_virtual_file_stats.* FROM sys.dm_io_virtual_file_stats
(
@dbId,
NULL
)
INNER JOIN sys.database_files ON sys.database_files.file_id = sys.dm_io_virtual_file_stats.file_id
GO

参考文章:

https://www.sqlpassion.at/archive/2016/08/29/files-and-file-groups-in-sql-server/

SQL Server将表数据移动到新的文件/文件组:

  (1)https://blog.csdn.net/apollokk/article/details/72472437

  (2)https://www.cnblogs.com/lyhabc/p/3480917.html    (精品推荐)

(2.1)备份与还原--sql server文件的概念及操作的更多相关文章

  1. 备份和还原SQL Server及压缩Access数据库

    功能说明:备份和恢复SQL Server数据库 * 作者: 刘功勋; * 版本:V0.1(C#2.0);时间:2007-1-1 * 当使用SQL Server时,请引用 COM组件中的,SQLDMO. ...

  2. (2.13)备份与还原--sql server数据库主要状态和切换路径

    SQLSERVER数据库主要状态和切换路径 关键词:数据库状态 一个SQLSERVER数据库会处于很多种状态,例如 ONLINE .RESTORING .RECOVERING .RECOVERY_PE ...

  3. 如何创建和还原SQL Server 2005数据库?

    在还原SQL Server 2005数据库文件之前,建议先把要还原的数据库文件复制粘贴到某个盘的根目录下,这样便于一会儿找到相关的文件,比如C盘. 先打开SQL Server 2005的Microso ...

  4. 如何创建和还原SQL Server 2000数据库?

    说明:这篇文章是几年前我发布在网易博客当中的原创文章,但由于网易博客现在要停止运营了,所以我就把这篇文章搬了过来,虽然现如今SQL Server 2000软件早已经过时了,但仍然有一部分人在使用它,尤 ...

  5. piap.excel 微软 时间戳转换mssql sql server文件时间戳转换unix 导入mysql

    piap.excel 微软 时间戳转换mssql sql server文件时间戳转换unix 导入mysql 需要不个mssql的sql文件导入mysql.他们的时间戳格式不同..ms用的是自定义的时 ...

  6. SQL Server 文件路径

    原文:SQL Server 文件路径 系统数据库文件路径 master <drvie>:\program files\microsoft sql server\mssql10.<in ...

  7. 还原SQL SERVER系统库

    还原SQL SERVER系统库 共需还原三个系统库,还原顺序:master>msdb>model 还原master (1).数据库配置管理器->数据库服务属性->启动参数-&g ...

  8. SQL Server 索引的图形界面操作 <第十二篇>

    一.索引的图形界面操作 SQL Server非常强大的就是图形界面操作.关于索引方面也一样那么强大,很多操作比如说重建索引啊,查看各种统计信息啊,都能够通过图形界面快速查看和操作,下面来看看SQL S ...

  9. 如何快速备份还原Sql Server 数据库

    备份数据库 选择你要备份的数据库,鼠标右键单击,选择任务-备份 弹出备份数据库窗口,选择添加 弹出选择备份目标窗口,点击浏览,选择存放备份数据库的目录,输入文件名,后缀名输入.bak,点击确定,确定, ...

随机推荐

  1. ftok函数例子

    #include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>int main( void ){ int ...

  2. 回车替换Tab 并不会 提交表单 IE Chrome 通过

    网上一堆可以回车替换tab的代码,可是基本都忽略谷歌浏览器的兼容性,找了3个小时 试了无数遍,终于总结出这一段代码,希望能帮到需要的同学,也给自己留个备忘        document.onkeyd ...

  3. adb not responding的解决方案

    查看谁占用了进程:netstat -aon|findstr "5037" 终止占用的进程: 假若"6908"占用了进程 taskkill /pid 6908 / ...

  4. KMP + 求最小循环节 --- HDU 1358 Period

    Period Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=1358 Mean: 给你一个字符串,让你从第二个字符开始判断当前长度 ...

  5. latex之图表位置控制

    \begin{table}[!htbp] !-忽略“美学”标准 h-here t-top b-bottom p-page-of-its-own

  6. bootstrap基础学习五篇

    bootstrap表格 Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. < ...

  7. css 动画

    CSS3动画相关的几个属性是:transition, transform, animation:我分别理解为过渡,变换,动画.虽意义相近,但具体角色不一.就像是SHE组合,虽然都是三个女生,都唱同一首 ...

  8. linux配置防火墙打开3306端口

      安装完MYSQL服务器后在本机所有操作都正常, 但在其它机器上远程访问这个MYSQL服务器时怎么都连接不上.  shit! 怀疑是端口问题, 结果: telnet 192.168.1.245 33 ...

  9. [WPF]实现密码框的密码绑定

    正如绑定TextBox控件的Text属性一样, 我们希望能够将PasswordBox空间的Password属性进行绑定, 比如在MVVM模式中,这似乎是必须的, 但可惜的是, Password属性是不 ...

  10. 终端利用ssh登录远程服务器

    第一步: 安装ssh:yum  install ssh 第二步: 启动ssh服务:service sshd start 第三步: 连接远程服务器: ssh -p 端口号 用户名@ip地址      然 ...