释放 SQL Server 数据库中未使用的空间

use*_*123 7 sql-server

我们已经从两位数 TB 大小的数据库中删除了大部分数据,现在想将一些空间释放回操作系统。数据库目前大约有 80% 的未使用空间。它永远不会再达到以前的大小(负载已转移到其他地方)。

我们尝试在单独服务器(非生产)上的数据库副本上运行 SHRINKDATABASE。运行 2 天(在我们的硬件上)它能够释放空间。

我假设生产中的数据库需要更长的时间,因为它被大量使用(尽管现在主要用于查询,插入较少)。

在生产系统上,只能接受数小时的停机时间(一次)。一些性能在长时间内下降也是可以接受的。

关于如何释放大量未使用空间,而不会造成过多停机时间或在此过程中导致严重性能下降的任何想法?

Mik*_*lsh 5

刚刚删除了我之前的答案,因为我开始针对此类问题提出一个建议的规范问题。如果标记不起作用,请在此处为您提供简短的答案。

你有几个选择。这里的重要“警告”是 - 收缩并不总是一件好事,它会使您的索引碎片化并且需要一些时间。所以谨慎行事。

  1. 您可以使用DBCC SHRINKFILE. 优点:不需要真正的开发,可能比迁移更少的停机时间。缺点:您仍在缩小数据库,您仍然需要处理碎片索引,但无论如何您应该进行一些索引重建,因为您已经删除了大量数据。
  2. 你可以建立一个新的数据库并选择数据到其中优点:你没有缩小。你开始“新鲜”和干净。您可以将其用作其他清理工作的时间。缺点:可能比只缩小块更努力,可能需要更大的向下窗口,具体取决于环境的复杂程度。在脚本中遗漏某些内容的潜在风险。
  3. 如果您选择了收缩路线,请记住重建您的索引并处理由此产生的碎片。