Sql-Server

Ola Hallengren 腳本:作業失敗後,如何跳過工作的數據庫並僅備份剩餘的數據庫?

  • March 4, 2021

在我們的組織中,我們在一個實例中擁有 150 多個數據庫,並且每天都應該執行完整備份。

我們的備份腳本應該採用這樣的方式,如果備份作業在獲取第 100 個數據庫時失敗並且如果我再次重新執行該作業,它應該從失敗的數據庫(第 100 個)開始並排除已經進行的備份並且腳本應該採用備份當天未備份的剩餘數據庫。我認為目前的備份腳本不能達到這個目的。

通常當一個或多個備份失敗時,您必須進行某種手動檢查。檢查日誌,修復問題並重新執行備份。

著眼於最後一步,我建議您從由 ola 腳本填充的 commandlog 表中收集失敗備份的數據庫列表。然後你應該將它用作 ola 腳本的 @databases 參數。

在每日備份作業中,您可以使用 ALL_DATABASES 標準 ola 參數作為第 1 步,作業在成功時結束。您可以使用動態生成的數據庫列表將 step2 作為恢復步驟。您執行它只是為了恢復失去的備份。

ola.hallengren doc 顯示了數據庫參數的一些選項,您可以指定要從該執行中排除的數據庫。

此外,系統表備份集

每個備份集包含一行。備份集包含來自單個成功備份操作的備份。

知道了這一點,您可以創建另一個作業或不同的作業步驟,在其中您將使用以下@RetryDatabases變數作為 Hallengren@Databases選項的參數並手動執行它:

DECLARE @RetryDatabases nvarchar(max);

;WITH exceptdbs (database_name) AS 
(
   SELECT N'ALL_DATABASES' --option for all databases

   UNION

   SELECT DISTINCT database_name
   FROM msdb.dbo.backupset
   WHERE type = 'D'
       AND is_copy_only = 0
       AND backup_start_date >= CONVERT(date, GETDATE())
)
SELECT @RetryDatabases = STRING_AGG(database_name, ', -')
FROM exceptdbs;

SELECT @RetryDatabases;

此解決方案使用自 sql server 2017 起可用的函式STRING_AGG,但如果您使用的是舊版本,還有其他方法可以將多行分組為一行

在 SQL Server 2014 中,一種可能的方法是將 替換SELECTSTRING_AGG

SELECT @RetryDatabases = STUFF((SELECT ', -' + database_name 
                               FROM exceptdbs FOR XML PATH('')), 1, 3, '');

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