Sql-Server

在伺服器級別顯示備份

  • June 12, 2019

我有一個 SSRS 報告,其中顯示列表中每個伺服器旁邊的“上次備份時間”。我通過以下方式獲取此資訊:

SELECT TOP 1 @@SERVERNAME as serverName,
sdb.Name AS DatabaseName,
MAX(backup_finish_date) AS LastBackUpTime
FROM sys.sysdatabases sdb
LEFT OUTER JOIN msdb.dbo.backupset bus ON bus.database_name = sdb.name
WHERE bus.type = 'D'AND bus.database_name NOT IN ('master', 'model', 'msdb', 'tempdb')
GROUP BY sdb.Name
ORDER BY LastBackUpTime DESC

這裡的問題是,例如,如果 8 個數據庫備份中有 7 個在作業中失敗,則該作業被標記為“失敗”,但報告將顯示上次備份時間是在那批失敗的備份中,它是,因為它正在選擇成功的 8 個備份。

在此之前,我從我插入 sysjobs 和 sysjobservers 資訊的表中查找特定作業的最後執行時間,因為我們的大多數備份作業都是同名的 hallengren 作業。(見下文)

SELECT serverName
        , MAX(CLastRunDateTime) AS CLastRunDateTime
   FROM  jobs
   WHERE name = 'DatabaseBackup - USER_DATABASES - FULL'

這樣做的問題是有些伺服器有一個非哈倫格倫命名的作業,所以它涉及“擺弄”來插入正確的作業名稱。還有一些伺服器沒有代理,手動備份,所以不能使用作業名稱來獲取上次備份時間。

如何在伺服器級別獲得盡可能少的“擺弄”的備份時間。我理解這些問題,因為一些哈倫格倫工作不包括某些數據庫,所以它不能基於“何時在此伺服器上進行所有備份” - 它必須一方面是特定於工作的,另一方面不是特定於工作的。也許是這樣的,當作業名稱是’X’,‘Y’,‘Z’時,然後以這種方式找到它,當作業名稱不存在時,然後對最後一個數據庫使用最大備份?但這似乎涉及我不想要的擺弄。

我不知道。想知道是否有人有這樣做的好方法。

這裡的問題是,例如,如果 8 個數據庫備份中有 7 個在作業中失敗,則該作業被標記為“失敗”,但報告將顯示上次備份時間是在那批失敗的備份中,它是,因為它正在選擇成功的 8 個備份。

據我了解,當其中任何一個未達到您的門檻值時,您希望該作業報告實例上的最新完整備份。

在這種情況下,您可以選擇獲取所有數據庫的最新完整備份,然後獲取該結果集的最小值。

;WITH CTE AS
(
SELECT 
sdb.Name AS DatabaseName,
MAX(backup_finish_date) AS LastBackUpTime
FROM sys.databases sdb
LEFT OUTER JOIN msdb.dbo.backupset bus ON bus.database_name = sdb.name
WHERE bus.type = 'D'AND bus.database_name NOT IN ('master', 'model', 'msdb', 'tempdb')
AND sdb.state_desc  = 'ONLINE'
GROUP BY sdb.Name
)

SELECT  @@SERVERNAME as serverName, 
       MIN(LastBackUpTime) as LastBackUpTime
FROM CTE;

如果您還需要最早成功完整備份的數據庫的數據庫名稱

;WITH CTE AS
(
SELECT 
sdb.Name AS DatabaseName,
MAX(backup_finish_date) AS LastBackUpTime
FROM sys.databases sdb
LEFT OUTER JOIN msdb.dbo.backupset bus ON bus.database_name = sdb.name
WHERE bus.type = 'D'AND bus.database_name NOT IN ('master', 'model', 'msdb', 'tempdb')
AND sdb.state_desc  = 'ONLINE'
GROUP BY sdb.Name
)

SELECT TOP(1)  @@SERVERNAME as serverName, 
       LastBackUpTime as LastBackUpTime,
       DatabaseName
FROM CTE
ORDER BY LastBackUpTime ASC;

我不會使用作業執行統計資訊,因為它們可能會返回誤報。

除了檢查備份作業是否正確完成工作之外,您還應該通過在某處恢復備份來驗證您的備份。

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