我有一个 1.2Tb SQL Server 2008 R2 数据库,其中 50% 以上是空的,因为我将很多功能迁移到 PostgreSql。该数据库仍在使用中,并且仍在增长,但我认为在未来 3-5 年内它不会增长到使用全部 1.2Tb。
按照目前的增长速度,我们不会在 14 年多的时间里用完 1.2Tb。更重要的是,每当我们需要进行重大更改时,我们都会将功能迁移到 PostgreSql。在一个非常动态的敏捷环境中,这意味着我们经常将数据迁移出这个 SQL Server 数据库。因此,该数据库在未来的增长速度可能会更慢:它最终会被逐步淘汰。
因此,我们宁愿将这个未使用的空白空间用于其他数据库等 - 可能永远不需要它来增长表/索引。
我记得曾经的经验法则是“永远不要缩小数据库”。它适用于这种情况吗?目前服务器运行的是 2008 R2 EE,但我们计划很快升级到 2012。我认为因为存在这种收缩功能,所以应该有有效的用例可以进行收缩。否则为什么它存在呢?
我们可以承受周末几个小时的停机时间。
编辑:我们正在解决的问题就像我上面所说的:“我们宁愿将这个未使用的空白空间用于其他数据库”。此外,我们更喜欢不需要花费太多时间来学习我们正在迁移的技术的解决方案。
是的。不要触摸那个收缩按钮——这是一条通用规则,也是许多著名 SQL Server 大师——Paul Randal、Brent Ozar、Mike Walsh、Gail Shaw等人提出的非常合理的建议。
您必须 1000% 确定您的假设,即它会在您提议的 3-5 年内增长但不会增长到这个规模(它也有 2 年的差异 :-))。
still somewhat growing
--> 你真的需要了解它的增长速度。您是否通过收集整个业务周期内的数据增长来进行数据库增长跟踪?如今,数据是企业维持业务的关键,而数据库则意味着增长。
想一想——您打算如何处理从缩小数据库中获得的磁盘空间?
正如@AaronBertrand 建议的那样,专注于更重要的优化领域。
即使你决定缩水,我也建议你
编辑
在OP的评论之后---
然后去做吧……因为您正在或将要从 SQL Server 转移数据到 PostgreSql。但是,正如我在回答中提到的那样,执行一次发布步骤 - 一旦您执行了收缩操作。此外,使用
DBCC SHRINKFIL
E 可以更好地控制要缩小的内容,而不是DBCC SHRINKDATABASE
.规则是永远不要收缩。规则是当你需要再次增长时不要缩小。
继续收缩以回收空间。处理由此产生的碎片。请注意,收缩会导致极端的磁盘负载。这些几乎是收缩导致的唯一问题。
或者,将所有索引重建为一个新的文件组并删除/截断旧的。这可能会快得多,并且会在此过程中对所有索引进行碎片整理/压缩。请注意,在文件组之间移动 blob 数据要困难得多,因此这可能不适用于所有索引/表。只是一个想法。
通过管理工作室收缩时收缩操作的一件重要事情是选项“释放未使用的空间”它的作用是
''导致文件中任何未使用的空间被释放给操作系统并将文件收缩到最后分配的范围,在不移动任何数据的情况下减小文件大小。不会尝试将行重新定位到未分配的页面。''
您应该尝试这个选项,因为没有页面移动的碎片机会非常少,如果数据库中有可用空间,则可以使用此选项。
知道收缩的缺点是件好事 我相信 Paul、Brent 和 Gail 的建议更多地是在教育用户了解收缩的缺点而不是阻止它们。如果你想回收空间,你必须在某个时候缩小,而缩小会导致碎片,所以你必须处理它。它不像没有人使用数据库收缩人们确实使用但不推荐在公共论坛上,因为他们不知道他们的周围环境和它会产生的影响。
我会说,如果您了解有关数据库的增长并知道在未来一年将不会使用空间,请谨慎收缩它可能是小块检查选项,我指出它是否有效