SQL Server資料庫判斷最近一次的備份執行結果

来源:https://www.cnblogs.com/kernelry/archive/2023/05/08/17383332.html
-Advertisement-
Play Games

1 麻煩的地方 在SQL Server的官方文檔裡面可以看到備份和還原的表,但是這些表裡面只能找到備份成功的相關信息,無法找到備份失敗的記錄,比如msdb.dbo.backupset。對於一些監控系統未監控作業的情況下,想要監控資料庫備份任務執行失敗而觸發告警規則,有些麻煩。 但是SQL serve ...


1 麻煩的地方

在SQL Server的官方文檔裡面可以看到備份和還原的表,但是這些表裡面只能找到備份成功的相關信息,無法找到備份失敗的記錄,比如msdb.dbo.backupset。對於一些監控系統未監控作業的情況下,想要監控資料庫備份任務執行失敗而觸發告警規則,有些麻煩。
但是SQL server內部是可以通過查詢errorlog來判斷資料庫備份作業是否成功:

2 獲取errorlog的trace表

我們可以藉助sys.traces定位到errorlog的trace文件路徑,然後通過再通過fn_trace_gettable將errlog的trace文件轉換為普通的表來查詢即可。

  1. 定位errorlog的trace文件物理路徑
SELECT
          REVERSE(
            SUBSTRING(
              REVERSE([path]),
              CHARINDEX(CHAR(92), REVERSE([path])),
              260
            )
          ) + N'log.trc'
        FROM
          sys.traces
        WHERE
          is_default = 1

輸出結果:
image
2. 得到路徑後,使用fn_trace_gettable將errolog的trace文件轉換為普通的數據表

SELECT
  *
FROM
  sys.fn_trace_gettable(
    'S:\MSSQL13.MSSQLSERVER\MSSQL\Log\log.trc',
    default
  )

image
3. 查找與備份相關的事件記錄,在trace文件中對應的EventClass為115,並將所有備份開頭的語句篩選出來

SELECT
  TextData,Databasename,StartTime
FROM
  sys.fn_trace_gettable(
    'S:\MSSQL13.MSSQLSERVER\MSSQL\Log\log.trc',
    default
  )
WHERE
  EventClass = 115
  AND UPPER(CONVERT(nvarchar(max), TextData)) LIKE 'BACKUP%'

image

從返回的TextData中沒有找到是否關於備份成功或者失敗的說明,也沒有在其它列中找到相關描述,需要結合msdb.dbo.backupset來判斷。

3 結合備份表backupset,判斷備份狀態

  1. 篩選出所有資料庫的備份任務執行情況

    從查詢的結果可知,每個成功的備份都有1個開始時間和結束時間,考慮將開始時間與trace文件轉換的表進行對比:
flowchart LR A[trace表的獲取備份記錄和時間]--> B[取得StartTime列] B[與backupset表對比判斷]--> C{是否存在與StartTime列對應的值} C--存在-->D[備份成功] C--不存在-->E[備份失敗]

形成了具體的思路後,下麵將trace轉換的表的StartTime列與backupset表的backup_start_date列進行對比判斷
2. 判斷存在對應的值則說明備份成功,不存在則備份失敗

SELECT
  dt.DatabaseName,
  dt.StartTime,
  bs.backup_start_date,
  bs.backup_finish_date,
  [Status] = CASE
    WHEN bs.backup_start_date IS NULL THEN (dt.DatabaseName) + '資料庫備份失敗'
    ELSE (dt.DatabaseName) + '資料庫備份成功'
  END
FROM
  sys.fn_trace_gettable(
    'S:\MSSQL13.MSSQLSERVER\MSSQL\Log\log.trc',
    default
  ) AS dt
  LEFT OUTER JOIN msdb.dbo.backupset AS bs ON dt.DatabaseName = bs.database_name
  AND ABS(
    DATEDIFF(SECOND, dt.StartTime, bs.backup_start_date)
  ) < 5
WHERE
  dt.EventClass = 115
  AND UPPER(CONVERT(nvarchar(max), dt.TextData)) LIKE N'BACKUP%'
ORDER BY
  dt.StartTime DESC;

image

4 形成用於告警的SQL語句

完成上面的操作之後,我們已經能夠看到所有資料庫的備份是成功還是失敗的狀態,現在還需要將SQL再度細化,輸出所有資料庫最近一次備份執行成功或者失敗的信息:即每個資料庫只有一行記錄用於說明最近一次的備份狀態。
下麵有兩種寫法可以實現,第1種是游標的寫法,性能極差,後來找chatgpt一起討論之後,採用了group by優化,形成第2種寫法。

  1. 第1種,游標查看每個資料庫最近一次備份狀態
點擊查看代碼
DBCC FREE
DECLARE @databaseName1 nvarchar(100)
DECLARE @sql nvarchar(4000)

DECLARE db_cursor CURSOR FOR
    SELECT name
    FROM sys.databases
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @databaseName1

WHILE @@FETCH_STATUS = 0  
BEGIN  
    SET @sql = '
	SELECT
  TOP 1 dt.DatabaseName,
  dt.StartTime,
  bs.backup_start_date,
  bs.backup_finish_date,
  [Status] = CASE
    WHEN bs.backup_start_date IS NULL THEN (dt.DatabaseName) + ''資料庫備份失敗''
    ELSE (dt.DatabaseName) + ''資料庫備份成功''
  END
FROM
  sys.fn_trace_gettable(
    (
      SELECT
        REVERSE(
          SUBSTRING(
            REVERSE([path]),
            CHARINDEX(CHAR(92), REVERSE([path])),
            260
          )
        ) + N''log.trc''
      FROM
        sys.traces
      WHERE
        is_default = 1
    ),
    default
  ) AS dt
  LEFT OUTER JOIN msdb.dbo.backupset AS bs ON dt.DatabaseName = bs.database_name
  AND ABS(
    DATEDIFF(SECOND, dt.StartTime, bs.backup_start_date)
  ) < 5
WHERE
  dt.EventClass = 115
  AND UPPER(CONVERT(nvarchar(max), dt.TextData)) LIKE N''BACKUP%''
  AND dt.DatabaseName=''' + @databaseName1 +''' ORDER BY dt.StartTime DESC'
    EXEC sp_executesql @sql
    FETCH NEXT FROM db_cursor INTO @databaseName1
END 
CLOSE db_cursor
DEALLOCATE db_cursor

可以看到性能極差,查詢3條數據耗時24秒,每次游標都要到消耗臨時表和進行大量的邏輯讀取。

點擊查看消耗的資源

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
表 'Worktable'。掃描計數 0,邏輯讀取 14 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysobjvalues'。掃描計數 14,邏輯讀取 36 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syspalvalues'。掃描計數 0,邏輯讀取 98 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysguidrefs'。掃描計數 2,邏輯讀取 30 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysclsobjs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syssingleobjrefs'。掃描計數 7,邏輯讀取 42 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysdbreg'。掃描計數 1,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 31 毫秒,占用時間 = 27 毫秒。
表 'Worktable'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysobjvalues'。掃描計數 2,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syspalvalues'。掃描計數 0,邏輯讀取 14 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysguidrefs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysclsobjs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syssingleobjrefs'。掃描計數 1,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysdbreg'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 16 毫秒,占用時間 = 23 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

(1 行受影響)
表 'backupset'。掃描計數 1,邏輯讀取 3 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 468 毫秒,占用時間 = 678 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 468 毫秒,占用時間 = 678 毫秒。
表 'Worktable'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysobjvalues'。掃描計數 2,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syspalvalues'。掃描計數 0,邏輯讀取 14 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysguidrefs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysclsobjs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syssingleobjrefs'。掃描計數 1,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysdbreg'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 16 毫秒,占用時間 = 23 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

(0 行受影響)
表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 406 毫秒,占用時間 = 732 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 406 毫秒,占用時間 = 732 毫秒。
表 'Worktable'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysobjvalues'。掃描計數 2,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syspalvalues'。掃描計數 0,邏輯讀取 14 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysguidrefs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysclsobjs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syssingleobjrefs'。掃描計數 1,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysdbreg'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 16 毫秒,占用時間 = 21 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

(0 行受影響)
表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 422 毫秒,占用時間 = 659 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 422 毫秒,占用時間 = 660 毫秒。
表 'Worktable'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysobjvalues'。掃描計數 2,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syspalvalues'。掃描計數 0,邏輯讀取 14 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysguidrefs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysclsobjs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syssingleobjrefs'。掃描計數 1,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysdbreg'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 15 毫秒,占用時間 = 616 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

(0 行受影響)
表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 375 毫秒,占用時間 = 678 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 375 毫秒,占用時間 = 678 毫秒。
表 'Worktable'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysobjvalues'。掃描計數 2,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syspalvalues'。掃描計數 0,邏輯讀取 14 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysguidrefs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysclsobjs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syssingleobjrefs'。掃描計數 1,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysdbreg'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 16 毫秒,占用時間 = 1286 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

(1 行受影響)
表 'backupset'。掃描計數 1,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 375 毫秒,占用時間 = 781 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 375 毫秒,占用時間 = 781 毫秒。
表 'Worktable'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysobjvalues'。掃描計數 2,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syspalvalues'。掃描計數 0,邏輯讀取 14 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysguidrefs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysclsobjs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syssingleobjrefs'。掃描計數 1,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysdbreg'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 31 毫秒,占用時間 = 1608 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 13 毫秒,占用時間 = 13 毫秒。

(1 行受影響)
表 'backupset'。掃描計數 1,邏輯讀取 3 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 390 毫秒,占用時間 = 737 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 406 毫秒,占用時間 = 751 毫秒。
表 'Worktable'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysobjvalues'。掃描計數 2,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syspalvalues'。掃描計數 0,邏輯讀取 14 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysguidrefs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysclsobjs'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'syssingleobjrefs'。掃描計數 1,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'sysdbreg'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 16 毫秒,占用時間 = 20 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 12 毫秒,占用時間 = 12 毫秒。

(0 行受影響)
表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 468 毫秒,占用時間 = 2492 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 484 毫秒,占用時間 = 2505 毫秒。
表 'Worktable'。掃描計數 0,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

 SQL Server 執行時間:
   CPU 時間 = 16 毫秒,占用時間 = 23 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

image

  1. 第2種,使用MAX函數和group by優化
SELECT
    [Status] = MAX(CASE
      WHEN bs.backup_start_date IS NULL THEN dt.DatabaseName+'資料庫備份失敗'
      ELSE dt.DatabaseName+'資料庫備份成功'
    END)
  FROM
    sys.fn_trace_gettable(
      (
        SELECT
          REVERSE(
            SUBSTRING(
              REVERSE([path]),
              CHARINDEX(CHAR(92), REVERSE([path])),
              260
            )
          ) + N'log.trc'
        FROM
          sys.traces
        WHERE
          is_default = 1
      ),
      default
    ) AS dt
    LEFT OUTER JOIN msdb.dbo.backupset AS bs ON dt.DatabaseName = bs.database_name
      AND ABS(DATEDIFF(SECOND, dt.StartTime, bs.backup_start_date)) < 5
  WHERE
    dt.EventClass = 115
    AND UPPER(CONVERT(nvarchar(max), dt.TextData)) LIKE 'BACKUP%'
  GROUP BY
    dt.DatabaseName

這次執行只要1秒鐘,占用的資源也極低。

SQL Server 分析和編譯時間: 
   CPU 時間 = 15 毫秒,占用時間 = 20 毫秒。

(3 行受影響)
表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 'backupset'。掃描計數 1,邏輯讀取 48 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

 SQL Server 執行時間:
   CPU 時間 = 469 毫秒,占用時間 = 935 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

 SQL Server 執行時間:
   CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

image


截止到此,基本大功告成了。接下來要實現的就是監控系統怎麼取得指標和觸發告警,具體可以根據不同的監控平臺進行配置。
實際上還可以通過xp_readerrorlog來讀取errorlog更加快速得篩選出備份失敗的記錄,但本次沒有再測試,有興趣的朋友可以自行參考測試。
image

5 使用xp_readerrorlog監控準確性更高

2023年5月10日增加:

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 收藏!最全Linux思維導圖 1. 認識 Linux 2. Linux 命令 3. Linux學習路徑 4. Linux 桌面介紹 5. FHS:文件系統目錄標準 6. Linux 需要特別註意的目錄 7. Linux 內核學習路線 8. Linux Security Coaching 9. Lin ...
  • macOS系統中預設的C/C++編譯器是clang/clang++,命令行使用gcc/g++或者clang/clang++來執行命令時,都是調用clang/clang++編譯器,想使用gcc/g++編譯器的話,我們可以自己安裝。 查看一下gcc和clang 1. 安裝Homebrew,官網鏈接,複製 ...
  • 在一個Oracle 12.1實例中,想監控一個表的索引使用情況,在system用戶下執行了下麵腳本以及輸出的監控索引腳本後,發現V$OBJECT_USAGE下一直沒有對應的記錄(在system用戶下查詢) SELECT 'ALTER INDEX '||OWNER||'.'||INDEX_NAME|| ...
  • (Oracle之table()函數) 一、序言 前段時間一直在弄報表,快被這些報表整吐了,然後接觸到了Oracle的table()函數。所以今天把table()函數的具體用法整理下,防止下次遇到忘記了。。 利用table()函數,可接收輸入參數,然後將pl/sql 返回的結果集代替table。由於表 ...
  • 摘要:在技術領域中,沒有銀彈。我們需要不斷探索和研究新的技術,結合具體問題和需求,選擇最適合的解決方案。 本文分享自華為雲社區《知乎問題:如何說服技術老大用 Redis ?》,作者:勇哥java實戰分享。 最近在某問答平臺看到一個技術討論:如何說服技術老大用Redis? “他總覺得用Redis每次都 ...
  • 摘要:本文以華為雲圖引擎 GES 為例,來介紹如何使用圖查詢語言 Cypher 表達一些需要做數據局部遍歷的場景。 本文分享自華為雲社區《使用 Cypher 子查詢進行圖探索 -- 以華為雲圖引擎 GES 為例》,作者:蜉蝣與海。 在圖資料庫 / 圖計算領域,很多查詢可以使用圖查詢語言 Cypher ...
  • (如何從800萬數據中快速撈出自己想要的數據) 一、需求調研 正如題目所說,我們使用的是Oracle資料庫,數據量在800萬左右。我們要完成的事情就是在著800萬數據中,通過某些欄位進行模糊查詢,得到我們所需要的結果集。 這是表裡的數據,一共7328976 條數據,接近800萬 select cou ...
  • 摘要:本文分析了分散式資料庫發展情況、分散式資料庫應用的主要問題,從行業應用的角度給出了分散式資料庫發展的建議。 本文分享自華為雲社區《數字化轉型下我國分散式資料庫應用挑戰及發展建議》,作者:資料庫領域科學家、華為雲資料庫GaussDB首席專家 馮柯。 當前,金融等重點行業都在進行數字化轉型,而分佈 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...