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

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

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

答案1

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

没有永不。

我在 ServerFault 上已经多次遇到过这种情况,我想向广大读者提供一些好的建议。如果人们不赞成这种做法,请投反对票,我会很乐意删除它。

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

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

自动收缩为何这么糟糕?

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

  1. 收缩-增长-收缩-增长会导致文件系统级碎片并占用大量资源。
  2. 你无法控制它何时启动(尽管它是常规的)
  3. 它使用大量资源。在数据库中移动页面需要 CPU、大量 IO,并生成大量事务日志。
  4. 真正的问题是:数据文件缩小(无论是否自动)会导致大量索引碎片,从而导致性能不佳。

不久前,我发表了一篇博客文章,其中有一个示例 SQL 脚本,展示了它导致的问题,并进行了更详细的解释。请参阅自动收缩——关闭它!(我的博客上不允许发布广告或类似的垃圾信息)。不要将这与缩小日志文件混淆,后者有时很有用,也很有必要。

所以请帮自己一个忙 - 查看数据库设置并关闭自动收缩。出于同样的原因,您也不应该在维护计划中加入收缩。请告诉您的同事。

编辑:我应该补充这一点,第二个答案提醒我——人们普遍误以为中断收缩操作会导致损坏。不会的。我曾经拥有 SQL Server 中的收缩代码——如果中断,它会回滚当前正在执行的页面移动。

希望这可以帮助!

答案2

当然,保罗是对的。

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

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

这是在机动车管理局的某个地方吗......我想知道。

答案3

它并不是“不安全”——它不会损坏任何东西。

但不建议在生产环境中使用这种方法,因为在生产环境中,数据库可能会在大量请求到来之前决定关闭并开始昂贵的重新安排操作,从而导致这些请求需要更长时间才能得到处理。最好使用计划收缩操作以及其他维护操作,例如备份(实际上,在备份之后 - 这样它会更多地来自事务日志)。或者除非存在增长问题,否则根本不收缩 - 您可以随时设置一个监视器,以便在未使用的分配空间增长超过一定比例或固定大小时通知您。

据我所知,除 Express 之外,所有 MSSQL 版本的所有数据库的此选项默认都是关闭的。

答案4

我见过同时启用了自动增长和自动收缩的 SQL 服务器。这个(相对强大的)服务器非常慢,因为它整天都在收缩和增加数据库文件。自动收缩可能很有用,但我建议做两件事:

  1. 默认关闭自动收缩。
  2. 记录您的服务器配置,以便您知道哪里启用了自动增长和自动收缩,哪里没有启用。

相关内容