Sql-Server

將 mdf 文件中的可用空間釋放給作業系統

  • April 10, 2017

我們有一個 120GB 的數據庫。有一個包含 60GB 數據的表是無用的,我們已經截斷了它。

現在數據庫大小為 120GB,可用空間為 60GB。該數據庫至少在 3 個月內不會增長到 60GB。那麼我們可以縮小數據文件嗎?

我知道碎片問題。我可以重建我的索引,因為我們的不是 24*7 的數據庫。

請關於縮小MDF文件的建議

您究竟想通過縮小數據庫來實現什麼?您應該為數據庫增長做好計劃,並為此增長預留空間。

那麼為什麼不保留它,為進入數據庫的新數據分配空間。

它已被討論過很多次,以至於您不想縮小數據庫。檢查一下並在縮小之前三思而後行:

停止收縮您的數據庫文件。嚴重地。現在。布倫特·奧扎爾

請閱讀我關於如何縮小數據庫的文章,我將在這裡總結:

查看您的數據文件大小

查看文件組中所有文件的大小。您希望組中的所有文件大小均勻,並且您希望為增長、索引維護等留出空間。寧可讓數據庫稍微太大,也不要將其縮小到太小。 . 就我個人而言,我的目標規模至少增長了 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;

考慮副作用

聽起來您已經這樣做了,並且可以在收縮後執行索引維護。確保您計劃有足夠的時間在維護時段內縮減和執行索引維護。使用維護視窗遷移到一個新的數據庫,或者將所有索引重建到一個新的文件組中,而不是縮小現有的文件組,可能會更快、更容易。

縮小數據庫

總是使用SHRINKFILE,從不SHRINKDATABASE。使用您在步驟 1 中確定的資訊來建構您的SHRINKFILE聲明。

USE [DatabaseName];
DBCC SHRINKFILE(LogicalName, TargetSize);

查看碎片和重組索引

如果您有定期維護工作,只需啟動該工作並讓它完成它就是魔法。這將需要比平時更長的時間,因為一切都會變得支離破碎。您將生成比平時更多的事務日誌,因此您將擁有更大的事務日誌備份,並且您還將看到任何日誌傳送、可用性組、鏡像等中的效果。

引用自:https://dba.stackexchange.com/questions/170621