關於刪除所有行並回收超大表空間的建議
我不是 dba…讓我們從那開始 :) 我是一名應用程序開發人員。但是我們的數據庫有一個 2.52 億行和 170GB 的存檔表,我的任務是修復它(實際上,這個類別中有多個表我需要清理)。但是我們決定不需要保留任何這些數據。因為這個表是一個歸檔表,我的意思是這個數據有一個主事務表,但是應用程序有辦法通過歸檔或移動舊記錄到這個歸檔表來保持事務表更小。
作為一個存檔表,它沒有每個 SSMS 的依賴項(沒有索引或外鍵)。此數據庫設置為完全恢復模式。
我們的維護視窗很短,所以需要一個快速的程序,而且我們的磁碟空間有限,所以我們需要從這個表中回收磁碟空間。
我們可以截斷表,但是如何回收空間呢?我們不想進行數據庫收縮,因為它會收縮所有表,因此我們需要執行索引重建……至少這是我的理解,這可能是不正確的。
我可以從 SSMS 中保存一個腳本(腳本表作為創建對象…)。然後刪除表,然後重新創建它……這有風險嗎?它會回收空間嗎?
其他想法?
因為您在數據庫管理方面的經驗有限,所以要格外小心。您設置了數據庫伺服器的測試副本,對嗎?
您提到數據庫使用完全恢復模式。這非常重要,因為如果事務日誌沒有得到足夠頻繁的備份,就沒有辦法縮小它們。您必須將數據庫置於簡單恢復模式(出於所有意圖和目的,該模式會刪除事務日誌)並等待該過程,然後您才能繼續前進。考慮到數據量,我想這需要一段時間。有關恢復模型的資訊,請訪問此處: https ://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/recovery-models-sql-server本文提供了基本概述。
要回答您的問題,截斷或刪除存檔表不會釋放空間 - 這就是縮小數據庫的作用。所有 truncate/drop 所做的就是將數據庫中的相應頁面標記為未使用。刪除表並重新創建它幾乎沒有意義。截斷基本上得到相同的最終結果並且不太容易出錯。
請記住,如果此應用程序向此存檔表發送更多數據,則在您執行收縮過程後數據庫將擴展!(您真的在使用 SQL Server 2005 嗎?如果是,請認真考慮升級到受支持的版本,如果是物理伺服器,則購買更新的硬體。)因此,就像應用程序將數據移動到存檔表一樣,您應該考慮實現一種方法從歸檔表中刪除不需要的數據,以避免將來出現這種情況。但首先要做的事情。
如果您還沒有,請閱讀以下內容:https ://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-shrinkdatabase-transact-sql這是一個描述收縮的 Microsoft 文件一個詳細的數據庫。這是一個不錯的概述,包含一些最佳實踐和注意事項。
如果您不想縮小數據庫,您的另一個選擇是創建一個新數據庫,將您想要從舊數據庫中保留的內容轉移到它,然後刪除舊數據庫。當然,這會佔用相當多的磁碟空間和時間。它還會使伺服器承受相當大的負載。
您是正確的,因為數據庫收縮會增加索引碎片。話雖如此,這種碎片化可能不會對性能產生明顯影響。這就是為什麼你有一個測試伺服器。:-)
您可能需要為此操作調整維護時段。只要需要,就會需要。在截斷過程中,數據庫將線上。您也可以在收縮期間保持數據庫線上。根據使用情況、查詢的調整方式、硬體和作業系統配置,性能可能會受到顯著影響。再次,在生產中做任何事情之前進行測試!收縮可以停止並在以後開始,但是,如果空間非常寶貴,則開始和停止會破壞目的。
還有一件事:根據將數據添加到該數據庫的速度,截斷和收縮可能只會延遲不可避免的情況。考慮增加儲存容量。
如果您有更多詳細資訊或澄清,我會相應地更新我的答案。與此同時,祝你好運,讓我們知道事情的進展!