Sql-Server

任何快速縮小數據庫以用作複製的方法

  • August 31, 2022

我們有一個超過 TB 的數據庫——我們通常會備份它,然後當開發人員創建複製數據庫以針對它進行開發時,會獲取該數據庫的副本並將其恢復到新的實例中。我們有很多開發人員確實不需要的數據(日誌表等)我想獲取主數據庫,執行 TFS 腳本將數據庫恢復到不同的伺服器,並將其從 Full 更改為簡單恢復模式,截斷很多大表收縮數據庫並備份它,然後使用這個副本來執行我們的複製系統。縮小需要很長時間——我已經執行了 4 個小時,到目前為止我們已經縮小了大約 13G 的數據。目前,我可以將它縮小到 336,857.24 MB——這需要幾天時間才能得到。有沒有人遇到過這個問題?有什麼方法可以更快地收縮嗎?我已經閱讀了有關創建新文件組的資訊,但我真的不想編寫每個表的腳本 - 有數百個表。謝謝你。

收縮就是收縮,它做它必須做的事情。沒有辦法讓它通過一些魔術開關或其他東西更快地將頁面移動到文件的開頭。由於頁面的移動,您將受到 I/O 的限制。

您可以隨時嘗試 TRUNCATEONLY 選項,看看您是否幸運(文件末尾有很大一部分沒有使用過的頁面)。但這可能很難自動化。

有些事情讓收縮變得超級慢:

  • 高球。對於移動的每個 LOB,它必須掃描表以查看引用該 LOB 頁的行。即,LOB 頁面沒有反向指針。假設您移動了 10,000 個 lob 頁面。您現在對該表進行了 10,000 次表掃描!
  • 堆。移動一個堆頁面,它必須修改該堆頁面上每一行的每個非聚集索引(因為堆頁面現在在文件中具有不同的物理地址)。
  • 阻塞。如果收縮被阻止,它就坐在那裡。永遠,可能。

看到你們可以先改善以上任何一項。將堆表更改為聚群表。截斷 LOB 頁面。等等,即在恢復之後但在收縮之前。

另一個選項可能是 DBCC CLONEDATABASE。使用正確的選項,如果您使用足夠高的 SQL Server 版本,您可以獲得數據庫的非數據副本。然後僅將您需要的數據從 prod 移動到該數據庫(使用 SSIS 或任何適合您的方法)。這是否有益將取決於您最終真正需要多少數據。

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