Sql-Server

SQL Server 空間回收

  • December 20, 2019

我們有一個相當大的 SQL Server 2016 數據庫(在 Windows 2016 Datacenter 上執行)。由於糟糕的 SQL 程序,一個表呈指數級增長。壞的SQL程序已經解決了,但是具體的表還是很大,數據庫實例在伺服器上搶了很多空間。也就是說,數據庫實例的物理大小非常大。

我們需要減小物理大小,許多人不推薦“收縮數據庫”,因為它會導致碎片。在將所有內容保存在同一台伺服器上的同時處理此問題,最好的做法是:

  1. 處理特定表

a) 創建一個腳本,該腳本將建構一個新表並從原始表中複製記錄。但不要複製由不良 SQL 程序創建的過多記錄。

b) 然後刪除原表並重命名新表。 2. 處理通用數據庫

c) 創建一個腳本來複製數據庫模式並使用它來創建一個新數據庫。

d) 然後將目前數據庫中的數據分塊寫入新數據庫(因為數據量很大)。

e) 刪除目前數據庫並重命名新數據庫。

但是,如果伺服器上的空間是實現此目的的問題,我可以:

f) 使用 SCHEMA 和 DATA 編寫整個數據庫

g) 刪除目前數據庫

h) 使用腳本重建整個數據庫

刪除正常工作時間之外的額外數據,然後收縮數據庫。不要把事情複雜化。

Andy Mallon 在如何通過 4 個簡單步驟縮小數據庫的文章中解釋瞭如何:

  1. 首先,您將使用sys.database_files系統視圖獲取實例上數據庫的文件大小。
  2. 然後使用DBCC SHRINKFILE,您將縮小每個有問題的文件。
  3. 最後,您將重建所有索引以確保處理任何碎片。

您的伺服器上是否有空間供您使用 #1 選項?

如果是這樣,那麼我會這樣做,確保所有最近的活動都在您的新表中,然後再刪除和重命名。如果可能的話,我肯定會在中斷期間嘗試這樣做,這樣您就不會在過渡期間面臨失去記錄或錯誤的風險。此外,如果數據庫處於 FULL 恢復模式,如果您要保留大量數據,您可能會考慮使用日誌備份循環您的表插入。

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