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


Answers:


70

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

没有永不。

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

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

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

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

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

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

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

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

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

希望这可以帮助!


有没有一种方法可以在收缩后立即重新编制索引?
Lance Roberts

4
不重新索引,因为那样会使文件再次增长(在删除旧索引之前先建立新索引),但是进行重新组织(通过我的旧DBCC INDEXDEFRAG或新的ALTER INDEX ... REORGANIZE)将整理碎片,但代价是更多IO,CPU,日志记录...
Paul Randal

我注意到删除自动收缩后,srrver的内存使用率更高。
user193655 '16

4

保罗当然是对的。

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

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

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


2
sys.databases具有一个字段is_auto_shrink(和is_auto-close,is_auto_update_stats等)
Paul Randal

很棒的即时通讯,我是如何得到一份报告的,以帮助我们知道哪些数据库配置为自动收缩,并且您的代码运行良好,并为我们从所有数据库中生成了良好的报告
saber tabatabaee yazdi

2

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

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

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


2
收缩不应该排定的-由于它们引起的问题,它们应该是很少见的操作。我不理解您对备份后进行收缩的评论-由收缩操作生成的日志记录将由下一个事务日志备份获取,无论您何时进行备份或进行其他何种备份。谢谢
Paul Randal

1

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

http://technet.microsoft.com/zh-CN/library/cc262731.aspx


不幸的是,该白皮书仅针对SharePoint安装,并且确实存在一些错误。我只是花了一些时间与白皮书的作者Bill Baer一起教当前的SharePoint MCM类。
Paul Randal

3
我在《 TechNet杂志》上的文章“有效的数据库维护-technet.microsoft.com/en-us/magazine/cc671165.aspx”中很好地介绍了数据库维护。
Paul Randal

1

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

  1. 默认情况下关闭自动收缩。
  2. 记录您的服务器配置,以便您知道启用了自动增长和自动收缩的位置以及未启用的位置。

1

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.