防止對未修改/略微修改的數據庫進行完整備份
有沒有辦法:
- 確保在 SQL 備份期間跳過未修改的數據庫,甚至更好
- 根據自上次完整備份以來數據庫更改的百分比在 DIFF 或 FULL 備份之間進行選擇?
我們正在使用 MS SQL Server 2008 R2 + Ola Hallengren 的維護腳本,約 500 個數據庫 - 總數據文件 500 x 2GB,每週只有大約 5% 的數據庫被修改 - 但備份過程會在每次完整備份時傳輸所有數據文件。
背景:
我們的 MS SQL 2008 R2 伺服器配置為使用“廣為人知”的 Ola Hallengren 的維護腳本進行每日 DIFF 備份和每週 FULL 備份. 該系統配置為多租戶,並且數據庫不僅按客戶而且按月進行物理拆分。由於系統很好地跟踪了這些數據庫,這使得系統更易於維護;每個客戶*月數據文件可以位於您選擇的任何位置,單個文件的大小更小,更易於管理,並且單個客戶的大多數 r/w 查詢只進入上個月的數據庫,從而提高了性能(較小的索引,更少的鎖定等)。恢復模式設置為 SIMPLE,但失去數據對我們來說不是問題,因為這些測量是從分佈式設備(也有本地儲存)收集的,並且可以自動重新傳輸數據。
但問題是備份過程變得異常緩慢,因為每個備份都會一遍又一遍地複制舊的、未修改的(嗯,大概是未修改的)備份。通常情況下,只有上個月的數據庫隨時被修改,所以我們只想每周備份一次。我檢查了舊數據庫不會被索引優化或其他任何東西意外修改:例如,
fn_dblog
在舊數據庫上執行只會顯示一些看似由備份過程添加的條目,如“CommitDifferentialBase”或“InvalidateDiffMaps”。更新
使用@spaghettidba’s answer中的連結,我稍微修改了Paul Randal 的儲存過程以簡單地返回百分比(以便更容易獲得返回值):
-- use at the end of 'sp_SQLskillsDIFForFULL' return ROUND ((CONVERT (FLOAT, @DIFFtotal) / CONVERT (FLOAT, @sizeTotal)) * 100, 2);
然後我在 Ola Hallengren 的
DatabaseBackup
儲存過程中添加了這個檢查:-- get the percent of changed extents since last full backup EXEC @CurrentDbChangedPercent = sp_SQLskillsDIFForFULL @CurrentDatabaseName IF @AutoSelectDiffOrFullOnChange = 1 AND @DiffFullChangePercentThreshold > 0 BEGIN IF @CurrentDbChangedPercent <= @DiffFullChangePercentThreshold BEGIN SET @CurrentBackupType = 'DIFF' END ELSE BEGIN SET @CurrentBackupType = 'FULL' END END
正如 Hallengren 先生所指出的,
DBCC PAGE
Paul 的 proc 中使用的命令並沒有得到真正的支持/記錄,這是目前這不是他的 SQL Server 維護解決方案功能的主要原因。除了保羅之外,很少有人能夠正確解析這些數據。從 2009 年開始,有人請求在 Microsoft Connect 上為此獲取受支持的 DMV:
在我看來,完全跳過備份不是一個好主意。您可能應該繼續進行差異備份。它們可能非常小,根本不用擔心。
Paul Randal使用此功能可以檢測自上次 FULL 備份以來更改的數據百分比。