收缩 SQL Server 数据文件,但不是一次全部收缩?

Sql*_*yan 4 database-administration shrink sql-server sql-server-2005

我有一个当前 150GB 的数据库文件,但只有 75GB 正在使用 - 这是因为我将所有索引(其他 75GB)移动到一个新的数据文件中。我想从这个数据文件中回收至少一部分空间,但是当我尝试缩小文件时,它无限期地“执行”,最终由于网络中断或其他我无法控制的事情而被取消(在跑步的日子)。即使使用“缩小到特定大小”功能并指定它只剪掉 10MB 似乎也永远不会返回 - 它只是在过程中断之前一直存在。

有没有另一种方法可以回收这个空间,甚至一次一点?

编辑:有人发布了一个链接,解释了为什么我不应该缩小我的数据库。我明白,无论如何我都想缩小它。这台服务器上的磁盘空间非常宝贵,并且数据库在很长一段时间内不会再次扩展到这个未使用的空间 - 正如我之前所说,我将索引从数据文件中迁移出来以释放这个空间,所以现在它被浪费了.

Bra*_*adC 6

不,使用DBCC SHRINKFILE ('filename', target_size)是正确的方法。

如果您想以“块”的形式进行,您可以设置逐渐变小的目标大小,或者在它被取消之前让它运行尽可能长的时间。

几点意见:

  • 放置一个合理的目标大小,并留出一些允许的可用空间。也许 75GB 的数据总共需要 90GB?
  • 在收缩运行时,检查活动监视器以查看 SPID 是否被阻止。如果文件末尾的页面上有一个打开的事务,那么在该事务提交或回滚之前,shrink 将无法移动它。
  • spid 真的在进步吗?(CPU和IO数量在变化)
  • 收缩有时需要很长时间,但它应该保存它的进度(意味着它一次移动一页,当它被取消时,所有完成的页面移动都已经完成)
  • 取消收缩后,尝试执行DBCC SHRINKFILE ('filename', TRUNCATEONLY). 它应该恢复文件末尾已经释放的所有空间(参见我之前的观点)
  • 如果您感到绝望,请尝试在单用户模式下重新启动 SQL,这样您就知道当时没有其他任何东西对 db 起作用(显然,这在 prod 服务器上是不可能的)
  • 一旦您能够完成收缩,请确保对数据库进行完整的重新索引以消除收缩产生的碎片。这可能会回收您刚刚释放的一些空间。
  • 如果您仍然无法使收缩工作,请查看有关此 SO 问题的一些讨论。显然在某些情况下收缩可能不会进展。