《SQL Server企业级平台管理实践》读书笔记——SQL Server如何设置自动增长和自动收缩项

原文:《SQL Server企业级平台管理实践》读书笔记——SQL Server如何设置自动增长和自动收缩项

SQL Server允许用户设置数据库初始值和最大值,可以通过自动增长或者自动收缩进行配置。通过这些配置,我们可以防止数据库空间问题而导致的应用程序修改失败或者SQL Server磁盘空间耗尽的事情发生。一般来讲,如果数据库不是很忙,默认的设置为自动增长,这种方式能够满足大部分的需求。但是在大量并发的情况下,申请数据文件和日志文件增长本身是一件非常消耗系统资源和影响性能的工作。所以如果完全依赖SQL Server自动完成,可能会导致系统性能不够稳定。一个管理得比较精细的系统,应该预先考虑到可能的空间使用需求,提前规划并引导数据的流向。尽量避免空间用尽而使得SQL Server不得不自动增长的现象发生。同时也要确保每一次自动增长都能够在可接受的时间内完成,及时满足客户端应用的需求。

下面我们讨论一下SQL Server数据文件和日志文件空间申请的一些特点。

假如我们有一个数据库,它有3个数据文件(假如它们属于同一个文件组)和两个日志文件

文件名 现有大小(MB) 现有空闲大小(MB)
MyDB_primary        2000 200
MyDB_secondary1 2000 100
MyDB_seconday2 2000 100
MyDB_log1 1000 500
MyDB_log2 1000 1000

假设现在有个客户端要插入40MB的数据,20MB的日志记录,SQL Server会怎样往这些文件里写呢?

SQL Server对于数据和日志有着不同的处理方法。

数据文件

SQL Server会按照同一个文件组里所有的文件现有空闲空间的大小,按这个比例把新的数据分布到所有有空间的数据文件里。如果某个文件已经写满了,SQL Server就不再继续往这个文件里写,而是写到其他有空间的文件里面。

比如上面的例子:因为3个文件空闲是200:100:100,40MB的数据就按照20MB:10MB:10MB的比例写入这3个文件。

日志文件

SQL Server对于日志记录是按照严格的顺序写入的。所以虽然这里有两个日志文件,SQL Server还是在一个时间点只写其中一个。只有这个文件写满了,SQL Server才会写入另外一个。

上面的案例数据库中,20MB的日志记录就都会写入MyDB_log1。

有时候我们会加入多个数据文件中,并把它们放在不同的磁盘上,以达到分散I/O负载的目的。从上面的处理方式我们可以看到。如果想达到这个目的,对于数据文件,就必须保证同一个文件组里所有数据文件都有基本一样大小的空闲空间。(不是这些文件一样大就可以的。)如果某个硬盘上的数据文件已经写满了,SQL Server就不会再往这个硬盘上写了。如果空闲空间相对比较下,SQL Server写的数目也会相对减少。

对于日志文件,由于SQL Server在同一个时间只有一个文件,所以加入多个日志文件对性能基本不会有什么帮助。

如果文件全部都能写满了,SQL Sever会怎么处理呢?在这里数据问价和日志文件也会稍有不同。

对于数据文件,SQL Server会选取其中一个文件(可能是任意一个)做自动增长,而不是让每一个数据文件都做自动增长。所有后面的数据都写入这个做了自动增长的文件里,直到这个文件再次写满,SQL Server要做下一次自动增长为止。换句话说,依靠自动增长,只能看到一个文件增长,很难享受到I/O负载平衡的效果。

对于日志文件,SQL Server自动增长当前的日志文件,以保证日志记录的连续性。

当某个操作触发了文件自动增长时,SQL Server会让那个操作等待。直到文件自动增长结束了,原先的那个操作才能继续进行。如果自动增长用了很长时间,原先的操作会等不及就超时取消了(一般默认的阀值是15秒),不但这个操作会回滚,文件自动增长也会被取消。也就是说,这一次文件没有得到任何增长。最坏的情况是,在一个时间点,有很多操作需要申请新的空间,可是谁都没有能够等文件自动增长完成就超时。这时体现在终端用户的数据,就是任何修改操作都不能被提交,全部超时。直到一个连接能够等待足够久,让SQL Server把这个自动增长做完。做完以后,其它本来超时的操作又忽然能恢复正常。

为什么一个自动增长可能会花费比较长的时间呢?这基本上都是由于每次需要增长的空间太大造成的。数据文件是按照8KB为单位存储的。所以做数据文件自增长的时候,SQL Server也要对这些新增加的部分进行格式化。如果一次要增长很大的空间,比如,上GB或者几十GB,这个格式化的过程就会很耗时。SQL Server2005以后的版本采用了延迟些技术。只要增长的新空间已经分配好。这次自动增长就算大功告成。SQL Server会用一个后台的线程把剩余的格式化做完。这样就大大缩短了一次增长的时间。前端不容易遇到超时失败。

还有一种极端,就是每次自动增长值太小,SQL Server要做好几次自动增长才能满足操作需求。同样的大小,一次一步到位话的时间比分好几次增长要少许多。所以自动增长值也不能太小。

鉴于以上几点,我们来总结一下:

1、要设置成固定大小增长,而不能按比例。这样就能避免一次增长太多或者太少所带来的不必要的麻烦。建议对比较小的数据库,设置一次增长50MB到100MB。对于大的数据库,设置一次增长100MB到200MB.

2、要定期检测各个数据文件的使用情况,尽量保证每个文件剩余的空间一样大,或者期望的比例。

3、设置文件最大值,以免SQL Server文件自增长用尽磁盘空间,影响操作系统。

4、发生自增长后,要及时检查新的数据文件空间分配情况。避免SQL Server总是往个别文件写数据。

除了自动增长,数据库还有一个自动收缩的功能。如果设定了这个功能,SQL Server每隔半个小时就会检查文件使用情况。如果空闲空间大于25%,SQL Server就会自动运行DBCC Shrinkfile的动作。所以这个功能能够防止数据申请过多的空间而不使用。对于一个磁盘空间很紧张的系统,这个设置无疑是有帮助的。但是从数据库自身的健康和性能考虑,这个设置并不建议多用。这是因为:

1、SQL Server只有空间用尽的情况下才会自动增长。如果没有找出自增长的原因,从而从根本上避免空间用尽。虽然能够暂时用DBCC Shrinkfile功能收缩文件大小,但是下次数据还是有可能长大。收缩数据库只是一个治标不治本的方法。

2、数据文件收缩给文件带来更多的碎片

3、不管是数据库收缩,还是增长,对于SQL Server来讲都是件浪费资源的事情。在负载比较重的系统里,对性能的影响尤其大。他们是尽量避免而不是鼓励的操作。

总之一句话:在一个比较繁忙的数据库,推荐的设置是开启数据库自动增长选项,以防数据库空间用尽导致应用程序失败,但是要严格避免自动增长的发生。同时,尽量不使用自动收缩功能。

时间: 2024-10-06 00:45:38

《SQL Server企业级平台管理实践》读书笔记——SQL Server如何设置自动增长和自动收缩项的相关文章

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

- 页是 SQL Server 中数据存储的基本单位,大小为 8KB. - 区是空间管理的基本单位,8个物理上连续的页的集合(64KB). - 页的类型包括: 1. Data 2. Index 3. Text/Image 4. Global Allocation Map 5. Shared Global Allocation Map 6. Page Free Space, Index Allocation Map 7. Bulk Changed Map 8. Differential Chang

《SQL Server企业级平台管理实践》读书笔记——SQL Server中收缩数据库不好用的原因

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server中收缩数据库不好用的原因 数据库管理员有时候需要控制文件的大小,可能选择收缩文件,或者把某些数据文件情况以便从数据库里删除. 这时候我们就要使用到DBCC SHRINKFILE命令,此命令的脚本为: DBCC SHRINKFILE ( { file_name | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATE

《SQL Server企业级平台管理实践》读书笔记——SQL Server数据库文件分配方式

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server数据库文件分配方式 1.文件分配方式以及文件空间检查方法 最常用的检查数据文件和表大小的命令就是:sp_spaceused 此命令有三个缺陷:1.无法直观的看出每个数据文件和日志文件的使用情况.2.这个存储过程依赖SQL Server存储在一些系统视图里的空间使用统计信息计算出的结果,如果没有更新空间统计信息,比如刚刚发生大数据插入,sp_spaceused的结果就不准确.3.这个命令主要是针对普通用户的数据库,对

《SQL Server企业级平台管理实践》读书笔记——几个系统库的备份与恢复

原文:<SQL Server企业级平台管理实践>读书笔记--几个系统库的备份与恢复 master数据库 master作为数据库的主要数据库,记录着SQL Server系统的所有系统级信息,例如登录用户.系统配置设置.端点和凭证以及访问其他数据服务器所需要的信息.master数据库还记录着启动服务器实例所需要的初始化信息,每个其它数据库的主文件位置.master数据库是SQL Server启动的时候打开的第一个数据库.SQL Server是从这个数据库里找到其它数据的信息的.如果master数据

《SQL Server企业级平台管理实践》读书笔记——关于SQL Server数据库的备份方式

数据备份一直被认为数据库的生命,也就是一个DBA所要掌握的主要技能之一,本篇就是介绍SQL Server备份原则,SQL Server数据库分为数据文件和日志文件.为了使得数据库能够恢复一致点,备份不仅需要拷贝数据数据文件里的内容,还要拷贝日志文件里的内容.那么根据每次备份的目标不同,我们可以将备份分为数据备份和日志备份. 数据备份的范围可以是完整的数据库.部分数据库.一组文件或文件组.所以根据备份下来的数据文件的范围,又分为了完整数据库备份.文件备份和部分备份. 完整数据库备份 完整数据库备份

《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结

Tempdb系统数据库是一个全局资源.可供连接到SQL Server实例的全部用户使用. 存储的内容项: 1.用户对象 用户对象由用户显示创建.这些对象能够位于用户会话的作用域中.也能够位于创建对象所用例程的作用域中. 例程能够是存储过程.触发器或用户自己定义函数. 用户对象能够是一下项内容之中的一个: 用户定义的表和索引 系统表和索引 全局暂时表和索引 table变量 表值函数中返回的表 2.内部对象 内部对象是依据须要由SQL Server数据库引擎创建的,用户处理SQL Server语句.

《SQL Server企业级平台管理实践》读书笔记——SQL Server中数据文件空间使用与管理

1.表和索引存储结构 在SQL Server2005以前,一个表格是以一个B树或者一个堆(heap)存放的.每个B树或者堆,在sysindexes里面都有一条记录相对应.SQL Server2005以后,引入了分区表的概念(Table Partition),在存储组织上,现有的分区基本上替代了原来表格的概念,原先表的概念成为了一个逻辑概念.一个分区就是一个B树或者一个堆.而一张表格则是一个到多个分区的组合. 1.1用B树存储于聚集索引的表数据页 如果一个表格上有聚集索引(Clustered In

《SQL Server企业级平台管理实践》读书笔记——当我们的备份都已经损坏的时候该怎么办

作为数据库管理员最最痛苦的莫过于,当数据库宕机的时候需要找备份,但在这个时候突然发现备份文件也是坏的,这就意味着数据会丢失,为此可能会丢掉职位,饭碗不保,所以为此,我们一定要保证好备份的完整性,一般发生这种情况的原因莫过于一下几种: 1.备份文件和数据库放在同一个(或一组)的物理磁盘上.磁盘出现故障,备份也保不住了. 2.备份介质随坏,或者做的是网络备份,数据在网络传输中发生了损坏. 3.数据库在做完整备份.文件备份或者文件组备份的时候,里面的内容就已经有了随坏. 所以基于此,我们要避免的就是以

jQuery内核详解与实践读书笔记1:原型技术分解2

上一篇已经搭建了一个非常简陋的jQuery框架雏形,如没有阅读搭建过程,请先阅读<jQuery内核详解与实践读书笔记1:原型技术分解1>初始搭建过程.接下来,完成书中介绍的剩下三个步骤: 7. 延续--功能扩展 jQuery框架是通过extend()函数来扩展功能的,extend()函数的功能实现起来也很简单,它只是吧指定对象的方法复制给jQuery对象或jQuery.prototype对象,如下示例代码就为jQuery类和原型定义了一个扩展功能的函数extend(). 1 var $ = j