启用 SQL Server 自动收缩是否安全?

Pau*_*dal 45 sharepoint database team-foundation-server sql-server

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

Pau*_*dal 72

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

没有永不。

我已经在 ServerFault 上多次遇到过这种情况,并希望通过一些好的建议来吸引广泛的受众。如果人们对这种做事方式不屑一顾,请投反对票,我会很乐意将其删除。

自动收缩是一种非常常见的数据库设置,已启用。这似乎是一个好主意 - 从数据库中删除额外的空间。有很多“非自愿 DBA”(想想 TFS、SharePoint、BizTalk 或只是普通的旧 SQL Server)可能不知道自动收缩是非常邪恶的。

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

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

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

  1. Shrink-grow-shrink-grow 会导致文件系统级别的碎片化并占用大量资源。
  2. 你无法控制它什么时候开始(即使它是普通的)
  3. 它使用大量资源。在数据库中移动页面会占用 CPU、大量 IO 并生成大量事务日志。
  4. 这是真正的问题:数据文件收缩(无论是否自动)会导致大量索引碎片,从而导致性能不佳。

不久前我写了一篇博客文章,其中有一个示例 SQL 脚本,它显示了它导致的问题并更详细地解释了这一点。请参阅自动收缩 - 将其关闭!(我的博客上没有广告或类似的垃圾)。不要将此与缩小日志文件混淆,这有时很有用且必要。

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

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

希望这可以帮助!

  • 不重新索引,因为这会再次增加文件(在删除旧索引之前建立新索引),但是进行重组(通过我的旧 DBCC INDEXDEFRAG 或新的 ALTER INDEX ... REORGANIZE)将整理碎片,以牺牲更多 IO、CPU、日志... (4认同)