Sql-Server
收縮 SQL Server 數據文件,但不是一次全部收縮?
我有一個目前為 150GB 的數據庫文件,但只使用了 75GB - 這是因為我將所有索引(另外 75GB)移動到了一個新的數據文件中。我想從這個數據文件中回收至少部分空間,但是當我嘗試縮小文件時,它會無限期地“執行”,最終由於網路中斷或其他我無法控制的事情而被取消(經過跑步日)。即使使用“縮小到特定大小”功能並指定它只是修剪 10MB 似乎永遠不會返回 - 它只是坐到程序被中斷。
有沒有其他方法可以讓我收回這個空間,哪怕是一點點?
編輯:有人發布了一個連結,解釋了為什麼我不應該縮小我的數據庫。我明白了,無論如何我都想縮小它。這台伺服器的磁碟空間非常寶貴,並且數據庫在很長一段時間內都不會再次擴展到這個未使用的空間——正如我之前所說,我將索引從數據文件中遷移出來以釋放這個空間,所以現在它被浪費了.
不,使用
DBCC SHRINKFILE ('filename', target_size)
是正確的方法。如果您想在“塊”中執行此操作,您可以設置逐漸減小的目標大小,或者在它被取消之前讓它執行盡可能長的時間。
幾點評論:
- 放置一個合理的目標大小,並留出一些允許的可用空間。75GB 的數據可能總共需要 90GB?
- 在收縮執行時,檢查活動監視器以查看 SPID 是否被阻止。如果文件末尾的頁面上有一個打開的事務,那麼在該事務送出或回滾之前,shrink 將無法移動它。
- spid真的在進步嗎?(CPU 和 IO 編號正在改變)
- Shrink 有時會花費非常非常長的時間,但它應該保存它的進度(意味著它一次移動 1 頁,當它被取消時,所有已完成的頁面移動都已經完成)
- 取消收縮後,嘗試執行
DBCC SHRINKFILE ('filename', TRUNCATEONLY)
. 它應該恢復文件末尾已經釋放的所有空間(請參閱我之前的觀點)- 如果您感到絕望,請嘗試在單使用者模式下重新啟動 SQL,這樣您就知道當時沒有其他任何東西對數據庫起作用(顯然,這在 prod 伺服器上可能是不可能的)
- 一旦您能夠完成收縮,請確保對數據庫執行完整的重新索引,以消除收縮產生的碎片。這可能會回收您剛剛釋放的一些空間。
- 如果您仍然無法使收縮工作,請查看有關此 SO question的一些討論。顯然在某些情況下收縮可能不會進展。