Sql-Server
將 mdf 文件中的可用空間釋放給作業系統
我們有一個 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);
查看碎片和重組索引
如果您有定期維護工作,只需啟動該工作並讓它完成它就是魔法。這將需要比平時更長的時間,因為一切都會變得支離破碎。您將生成比平時更多的事務日誌,因此您將擁有更大的事務日誌備份,並且您還將看到任何日誌傳送、可用性組、鏡像等中的效果。