如何恢复SQL Server数据库并同时收缩其文件?

比方说,我有一个SQL Server数据库,其数据文件的初始大小为100 GB,但只包含10 GB的数据。 数据库备份将只有10 GB的大小。

我想将这个备份恢复到不同的服务器(或同一台服务器上的不同数据库),但我不希望它与原来的(100 GB)磁盘空间相同,这是默认情况下会发生的情况。

在进行备份之前,我无法收缩原始数据库(这是一个生产数据库, 需要预先分配的空间)。 恢复完成后,我可以收缩恢复的数据库,但是我真的希望不要占用100 GB的空间; 此外,在这个特定的情况下,我没有太多的可用磁盘空间,所以还原不会在任何地方。

有什么办法可以恢复数据库,并且只占用与其包含的实际数据一样多的空间

不,对不起 – 没办法。 还原恢复文件在备份时的状态。 必须在此之后或者在进行备份之前完成。

如果您的磁盘空间太紧,那么您可以将.bak文件放在networking共享中并从那里恢复。 应该工作,如果你正在运行的SQL Server与一个域帐户,并给予共享足够的权利来读取文件。

以前的其他选项是你疯了篮子(但只有当你运行SQL Server 2008 R2)是SQL Server支持创build数据库文件直接到共享而无需使用traceflag&我可以告诉从个人的经验,你的作品! 所以你可以做一个恢复与移动共享。

一般来说,没有。 一些随机的想法可能会或可能不会对你有任何帮助:

  • 除非您绝对需要来自该特定备份的数据,否则您可以创build一个新的(空的)目标大小的数据库,并使用批量复制(或SSIS)将当前(活动)数据库中的所有表复制到您的副本中。
  • 有些第三方工具(例如Redgate Compare)可以帮助自动化这种事情,如果这不仅仅是一次性操作的话。
  • 某些第三方备份软件(例如Quest Litespeed)可以执行“ 对象级恢复 ”,它可以将单个表或其他对象恢复到新的(空的)数据库。 即使备份不是使用Litespeed创build的,我相信该产品应该可以在Native SQL备份上运行。

最后,我也喜欢在我的制作数据库中使用一些“肘部空间”,但总共100GB的90GB听起来有点极端。 以下步骤可能会为您提供所需且不应影响生产的内容:

  1. 在生产数据文件上运行DBCC SHRINKFILE ('myfile.MDF', TRUNCATEONLY)以临时释放文件末尾的任何可用空间(TRUNCATEONLY不是IO密集型的,并且不会对索引进行分段)
  2. 如果日志文件也很大,则在进行日志备份之后,在低活动期间在生产日志文件上运行DBCC SHRINKFILE
  3. 运行备份
  4. 执行ALTER DATABASE MODIFY FILE将生产数据文件重新生长回原始大小。

使用这些步骤不应该有任何生产影响。 唯一的风险是如果一些数据恰好在100GB的数据文件的末尾,在这种情况下,步骤(1)将不会释放太多的空间。