我有一个 MDF 文件,它以 10% 的增量从 1MB 自动增长到 40GB。该文件现在非常碎片化,我想以最少的停机时间对其进行碎片整理。
我有一个我不确定是否可行的计划:
- 通常在服务仍在运行时对分区进行碎片整理,直到唯一的碎片文件是数据库文件。
- 进入单用户模式。
- 完全备份到不同的分区。
- 删除带有碎片 MDF 文件的数据库。
- 从最近创建的备份创建/恢复新数据库。
删除数据库然后从备份中恢复会删除文件碎片吗?
或者我应该关闭服务并运行碎片整理工具直到它完成?
我有一个 MDF 文件,它以 10% 的增量从 1MB 自动增长到 40GB。该文件现在非常碎片化,我想以最少的停机时间对其进行碎片整理。
我有一个我不确定是否可行的计划:
删除数据库然后从备份中恢复会删除文件碎片吗?
或者我应该关闭服务并运行碎片整理工具直到它完成?
在 ServerFault上对这个主题进行了很好的讨论,其中讨论了 3 种形式的碎片。在发布问题之前,我总是要提醒自己寻找答案,因为它可以节省我很多时间。
简短回答(tl/dr):
它将删除日志文件中的物理碎片,但不会删除逻辑碎片或 VLF 碎片。
物理碎片:
备份和恢复将消除任何物理碎片。也就是说,NTFS 分区上发生的碎片是由于您的数据库随着时间的推移而逐渐增长,因此导致连续空间不可用。
其他碎片化:
您仍然会在数据库中出现索引碎片和VLF 碎片。Paul Randall 在他的SQLSkills Immersion Events中强调不使用 Windows Defrag ,以及它如何导致数据库损坏,所以我认为您走在正确的轨道上。
背景:
物理碎片会在 MDF/NDF/LDF 文件占用的磁盘上进行操作。由于 SQL Server 不会跟踪此信息,因为它是无用的。只要有空间,我们希望能够将数据库恢复到任何硬盘驱动器,我们不太关心它在磁盘上的位置,除非你写得很短......但这是规则的例外.