菜鸟学SQLServer--数据文件和日志文件

昨天讲到的是 页和区, 今天就想写一些 数据文件和日志文件那些事。

根据MSDN library [1],SQL Server有三种类型的文件,分别是:

  • 主数据文件 -- 后缀为 .mdf
  • 次要数据文件 -- 后缀为 .ndf
  • 日志文件 -- 后缀为.ldf

 

数据文件:

从示例数据库我们可以看到,里面有一个主数据文件和一个日志文件,次要数据文件不是必须的。

同时每个文件都有一个文件号,fileID or filenum,用来标识该文件。

比如上一篇文章的DBCC page 命令,唯一标识数据库中的一页,需要  数据库名称或者dbid +  文件号filenum  +  页号pagenum

dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])

 

#命名

每个文件都有两个名称,分别是 逻辑名称(logical_file_name) 及 路径和文件名组成的物理文件名(os_file_name).

前者必须唯一,后者必须符合操作系统的命名规则。

 

#文件组

对于文件我们还能按文件组来管理,从主文件组的文件数 1 可以看出,文件组是不包含日志文件的。

另外我们还可以添加自定义的文件组。

使用文件组能够帮助数据布局和管理任务,比如备份和还原

 

#文件增长

SQLServer 支持用户设置数据库初始值、最大值。

对于数据文件,把不同的文件放在不同的硬盘加快读写。

但需要注意的是对于新数据,SQLServer是按同一文件组中所有文件现有空闲空间的大小比例来分配新数据写入的文件。

比如两个文件空闲空间分别为 2GB和1GB,那么新数据将按 2:1的比例分别写入两个文件。

日志文件则不一样,由于日志文件是严格按顺序写入(估计是为了确保数据库的完整性和方便数据恢复),所以多个日志文件没法提高并发性能也就没有按比例写入一说。

在《Microsoft SQL Server企业级平台管理实践》一书中有如下建议:

  1. 要设置成按固定大小增长,而不能按比例。这样就能避免一次增长太多或者太少所带来的不必要的麻烦。建议对比较小的数据库,设置一次增长50 MB到100 MB。对大的数据库,设置一次增长100 MB到200 MB。
  2. 要定期监测各个数据文件的使用情况,尽量保证每个文件剩余的空间一样大,或者是期望的比例。
  3. 设置文件最大值,以免SQL Server文件自增长用尽磁盘空间,影响操作系统。
  4. 发生自增长后,要及时检查新的数据文件空间分配情况。避免SQL Server总是往个别文件写数据。

 

日志文件:

#VLF(虚拟日志文件)

一个日志文件被划分成多个虚拟日志文件。

而虚拟虚拟日志文件的个数和大小是管理员不能设置的,而是由创建或扩展日志文件时由数据库引擎动态决定。

那么问题来了,为什么要使用虚拟日志文件? 这里留下一个疑问

 

#日志文件是一种回绕文件

当日志记录到末端

附上MSDN的图

 

 

 

和数据文件一样,日志文件可以有多个。如果日志包含多个物理日志文件,则逻辑日志在回绕到首个物理日志文件始端之前,将沿着所有物理日志文件移动。

由此看来,把多个日志文件放在不同的硬盘并不能提高I/O 并发。因为它始终是线性记录。而且由于它是顺序记录,写入位置确定所以效率 较写入数据高,因为不用像数据页那样分布在硬盘的不同位置。

 

 

参考:

[1]https://msdn.microsoft.com/zh-cn/library/ms179316(v=sql.105).aspx

[2]http://www.cnblogs.com/CareySon/archive/2012/02/13/2349751.html

《Microsoft SQL Server企业级平台管理实践》

 

posted @ 2015-04-02 00:07  Bournex  阅读(1715)  评论(0编辑  收藏  举报