将 mdf 文件中的可用空间释放到操作系统

Pரத*_*ீப் 4 sql-server shrink database-size datafile

我们有一个 120GB 的数据库。有一个包含 60GB 数据的表,这是无用的,我们已经截断了它。

现在数据库大小为 120GB,可用空间为 60GB。数据库至少在 3 个月内不会增长到 60GB。所以我们可以缩小数据文件。

我知道碎片问题。我可以重建我的索引,因为我们的不是 24*7 的数据库。

请建议缩小MDF文件

Geo*_*e K 6

您究竟想通过缩小数据库来实现什么?您应该为数据库增长做好计划并为此增长预留空间。

那么,您为什么不保持原样,为进入您的数据库的新数据分配空间。

已经讨论了很多次,以至于您不想缩小数据库。检查一下并在缩小之前三思而后行:

停止缩小您的数据库文件。严重地。现在。布伦特·奥扎尔


AMt*_*two 5

请阅读我关于如何缩小数据库的帖子,我将在此处进行总结:

查看您的数据文件大小

查看文件组中所有文件的大小。您希望组中的所有文件大小均匀,并希望为增长、索引维护等留出空间。 将数据库保留得过大比将其缩小至过小更有意义. 就我个人而言,我认为我的目标规模至少要增长 6 个月。

SELECT
     LogicalName = dbf.name
    ,FileType = dbf.type_desc
    ,FilegroupName = fg.name
    ,PhysicalFileLocation = dbf.physical_name
    ,FileSizeMB = CONVERT(DECIMAL(10,2),dbf.size/128.0)
    ,UsedSpaceMB = CONVERT(DECIMAL(10,2),dbf.size/128.0 - ((dbf.size/128.0)
               - CAST(FILEPROPERTY(dbf.name, 'SPACEUSED') AS INT) /128.0))
    ,FreeSpaceMB = CONVERT(DECIMAL(10,2),dbf.size/128.0
           - CAST(FILEPROPERTY(dbf.name, 'SPACEUSED') AS INT)/128.0)
FROM sys.database_files dbf
LEFT JOIN sys.filegroups fg ON dbf.data_space_id = fg.data_space_id
ORDER BY dbf.type DESC, dbf.name;
Run Code Online (Sandbox Code Playgroud)

考虑副作用

听起来您已经这样做了,并且可以在收缩后执行索引维护。确保在维护窗口期间计划足够的时间来缩小和执行索引维护。使用维护窗口迁移到新数据库或将所有索引重建到新文件组中,而不是缩小现有文件组,可能会更快、更容易。

缩小你的数据库

始终使用SHRINKFILE,从不使用SHRINKDATABASE。使用您在步骤 1 中确定的信息来构建您的SHRINKFILE语句。

USE [DatabaseName];
DBCC SHRINKFILE(LogicalName, TargetSize);
Run Code Online (Sandbox Code Playgroud)

查看碎片并重新组织索引

如果您有定期维护工作,只需开始这项工作并让它完成它就很神奇。这将需要比平时更长的时间,因为一切都将真正支离破碎。您将生成比平时更多的事务日志,因此您将拥有更大的事务日志备份,并且您还将看到任何日志传送、可用性组、镜像等方面的影响。