it-swarm.cn

开启SQL Server自动收缩功能是否安全?

可以为数据库启用许多SQL Server选项,而最容易被误解的选项之一是自动收缩。安全吗?如果没有,为什么不呢?

44
Paul Randal

(我最初问的是一个常规问题,但后来找到了正确的方法-感谢BrentO)

没有永不。

我现在已经在ServerFault上遇到过几次,并希望通过一些好的建议来吸引大量的读者。如果人们不喜欢这种处理方式,请拒绝投票,我会很乐意将其删除。

自动收缩是已启用的非常常见的数据库设置。似乎是个好主意-从数据库中删除多余的空间。那里有很多“非自愿DBA”(例如TFS,SharePoint,BizTalk或只是常规的旧SQL Server)可能不知道自动收缩肯定是有害的。

在Microsoft期间,我曾经拥有SQL Server存储引擎并试图删除自动收缩功能,但是为了向后兼容,它不得不保留下来。

为什么自动收缩如此糟糕?

数据库很可能会再次增长,那么为什么要收缩呢?

  1. 收缩增长收缩增长导致文件系统级别的碎片化并占用大量资源。
  2. 您无法控制启动时间(即使它是常规的)
  3. 它使用大量资源。在数据库中四处移动页面会占用大量CPU,大量IO,并会生成大量事务日志。
  4. 这是真正的关键所在:数据文件的收缩(无论是否自动)都会导致大量的索引碎片,从而导致性能下降。

不久前,我写了一篇博客文章,其中包含一个示例SQL脚本,该脚本显示了它引起的问题并进行了更详细的说明。请参阅 自动收缩–将其关闭! (没有像我的博客上那样的广告或垃圾)。不要将其与收缩日志文件混淆,有时这是有用且必要的。

所以请您帮忙-查看数据库设置并关闭自动收缩功能。出于完全相同的原因,您也不应该缩减维护计划。向你的同事传播道。

编辑:我应该添加这个,第二个答案提醒-常见的误解是中断收缩操作会导致损坏。不,不会。我曾经在SQL Server中拥有收缩代码-如果被中断,它将回滚当前正在执行的当前页面移动。

希望这可以帮助!

71
Paul Randal

保罗当然是对的。

查看所有数据库及其自动收缩设置。如果您有很多数据库,一个数据库就会潜入。

sp_msforeachdb  @command1 = 'Select ''[?]'',DATABASEPROPERTYEX(''?'',''IsAutoShrink'')'

这是在dmv的某个地方吗?...我想知道。

4
Sam

这不是“不安全的”-不会损坏任何东西。

但是,不建议在生产环境中使用该数据库,因为在这些环境中,数据库可能决定在刚开始发出大量请求之前就决定开始执行昂贵的重新安排工作,从而使这些请求需要更长的时间才能得到服务。使用调度收缩操作以及其他维护操作(例如备份)(实际上,在备份之后-这样会从事务日志中获得更多收益)会更好。或者,除非出现增长问题,否则根本不会收缩-您始终可以设置一个监视器,以通知您未使用的已分配空间何时超过某个比率或固定大小。

IIRC默认情况下,除Express之外,所有MSSQL版本中的所有数据库均关闭该选项。

2
David Spillett

TechNet上有一份白皮书,详细解释了SQL维护。

http://technet.Microsoft.com/en-us/library/cc262731.aspx

1
Jeremy Thake

我已经看到同时启用了自动增长和自动收缩的SQL Server。这个(相对强大)的服务器非常慢,因为它整天所做的只是缩小和增长数据库文件。自动收缩可能会很有用,但我建议您做两件事:

  1. 默认情况下关闭自动收缩。
  2. 记录您的服务器配置,以便您知道在哪些地方启用了“自动增长”和“自动收缩”。
1
Carl C

我唯一被迫收缩数据库的方法是在磁盘空间较小(不足以容纳生产数据库)的测试服务器上刷新副本。

生产数据库的文件具有足够的可用空间,不幸的是,您必须使用与备份时相同的文件大小来还原数据库。因此别无选择,只能在备份之前缩减产量。 (这种收缩需要很长时间,大量资源被消耗,随后的事务日志增长是有问题的。)

1
SuperCoolMoss

另请查看此视频教程..。

观看Paul Randal演示收缩和自动收缩如何引起数据库的严重碎片问题 http://wtv.watchtechvideos.com/topic194.html

1
Sakthivel Chidambaram