SQL Server数据库判断最近一次的备份执行结果

2023-05-09 04:48:55 来源:博客园 分享到:


(资料图)

1 麻烦的地方

在SQL Server的官方文档里面可以看到备份和还原的表,但是这些表里面只能找到备份成功的相关信息,无法找到备份失败的记录,比如msdb.dbo.backupset。对于一些监控系统未监控作业的情况下,想要监控数据库备份任务执行失败而触发告警规则,有些麻烦。但是SQL server内部是可以通过查询errorlog来判断数据库备份作业是否成功:

2 获取errorlog的trace表

我们可以借助sys.traces定位到errorlog的trace文件路径,然后通过再通过fn_trace_gettable将errlog的trace文件转换为普通的表来查询即可。

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

输出结果:2. 得到路径后,使用fn_trace_gettable将errolog的trace文件转换为普通的数据表

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

3. 查找与备份相关的事件记录,在trace文件中对应的EventClass为115,并将所有备份开头的语句筛选出来

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

从返回的TextData中没有找到是否关于备份成功或者失败的说明,也没有在其它列中找到相关描述,需要结合msdb.dbo.backupset来判断。

3 结合备份表backupset,判断备份状态筛选出所有数据库的备份任务执行情况从查询的结果可知,每个成功的备份都有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) + "数据库备份成功"  ENDFROM  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)  ) < 5WHERE  dt.EventClass = 115  AND UPPER(CONVERT(nvarchar(max), dt.TextData)) LIKE N"BACKUP%"ORDER BY  dt.StartTime DESC;
4 形成用于告警的SQL语句

完成上面的操作之后,我们已经能够看到所有数据库的备份是成功还是失败的状态,现在还需要将SQL再度细化,输出所有数据库最近一次备份执行成功或者失败的信息:即每个数据库只有一行记录用于说明最近一次的备份状态。下面有两种写法可以实现,第1种是游标的写法,性能极差,后来找chatgpt一起讨论之后,采用了group by优化,形成第2种写法。

第1种,游标查看每个数据库最近一次备份状态
点击查看代码
DBCC FREEDECLARE @databaseName1 nvarchar(100)DECLARE @sql nvarchar(4000)DECLARE db_cursor CURSOR FOR    SELECT name    FROM sys.databasesOPEN db_cursorFETCH NEXT FROM db_cursor INTO @databaseName1WHILE @@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) + ""数据库备份成功""  ENDFROM  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)  ) < 5WHERE  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 @databaseName1END CLOSE db_cursorDEALLOCATE 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 毫秒。
第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 毫秒。

截止到此,基本大功告成了。接下来要实现的就是监控系统怎么取得指标和触发告警,具体可以根据不同的监控平台进行配置。实际上还可以通过xp_readerrorlog来读取errlog更加快速得筛选出备份失败的记录,但本次没有再测试,有兴趣的朋友可以自行参考测试。

标签:

SQL Server数据库判断最近一次的备份执行结果

来源:博客园 2023-05-09 04:48:55

风流书呆重生之月光少年-风流书呆

来源:互联网 2023-05-09 03:02:31

台湾4月出口数据年减13.3% 呈现“连八黑”

来源:中国新闻网 2023-05-09 00:43:43

企业遇到难事?威海经开区“项目管家”将定制服务包送上门|世界报道

来源:威海新闻网 2023-05-08 22:41:34

长城电影票房是多少_长城电影票房是多少|环球关注

来源:互联网 2023-05-08 21:43:20

第五人格赛事,为体育和电竞带来了怎样的想象空间?

来源:凤凰网 2023-05-08 21:02:51

欧盟将延长对乌克兰粮食的贸易禁令|要闻速递

来源:央广网 2023-05-08 20:11:15

[路演]奥普光电:医疗器械产品主要用于对特殊人群视觉、生理指标等检测和监测

来源:全景网 2023-05-08 19:52:22

软控股份:截至2022年底橡胶装备系统的营业收入占比约为57%-前沿资讯

来源:红周刊综合整理 2023-05-08 19:15:44

宝骏的发展史,更是“神车”陨落的血泪史 当前观察

来源:懂车帝 2023-05-08 18:12:33

每日快播:大宗交易:天亿马成交202.36万元,折价10.00%(05-08)

来源:东方财富Choice数据 2023-05-08 17:52:23

瞭望 | 滇池奋笔“人城湖产”答卷|今日要闻

来源:新华社新闻 2023-05-08 17:28:33

汉语言文学考研考什么科目_汉语言文学考研考什么-世界快资讯

来源:互联网 2023-05-08 16:53:18

环球微动态丨一个减少投资判断失误的方法

来源:钛媒体官方 2023-05-08 16:27:58

【世界聚看点】1.87万亿!A股连续6年分红超万亿

来源:东方财富研究中心 2023-05-08 16:07:55

小数怎么化成分数六年级_小数怎么化成分数_每日热闻

来源:互联网 2023-05-08 15:27:35

产业数字金融大有可为

来源:中国经济网-《经济日报》 2023-05-08 15:08:21

360创始人周鸿祎在抖音分享ChatGPT等新技术建议

来源:ITBEAR 2023-05-08 14:27:35

力诺特玻:5月6日召开业绩说明会,投资者参与

来源:证券之星 2023-05-08 13:55:46

当前热议!河南跨境电商形成全省联动发展新格局

来源:中评网 2023-05-08 13:10:38

功勋模范丨博爱人间 “救”在身边——2022年度“十大最美救护员”速写-报资讯

来源:新华网 2023-05-08 12:49:30

蛋仔派对茨球皮肤怎么获得-天天热点

来源:互联网整理 2023-05-08 12:12:49

【环球新视野】二阳的症状会更轻吗?专家解读

来源:亚汇网 2023-05-08 11:28:10

华创证券:维持海吉亚医疗(06078)“推荐”评级 目标价70港元

来源:智通财经 2023-05-08 11:05:54

全球今亮点!阶段性机会再现?数字经济ETF(560800)涨超1%

来源:证券之星 2023-05-08 10:24:47

小鸡宝宝考考你我们经常把为爱情牵线搭桥的人称为“红娘”,这个人物“成名”于 全球看点

来源:元宇宙网 2023-05-08 10:01:04

每日精选:12530是什么热线电话_12530

来源:互联网 2023-05-08 09:23:34

天天热资讯!scanner error 20是什么意思_scanner error 12

来源:互联网 2023-05-08 09:03:44

我的劳动权益如何保障

来源:中国青年报 2023-05-08 08:22:55

一代沙雕什么时候出 公测上线时间预告_焦点热讯

来源:九游 2023-05-08 07:19:41

Copyright   2015-2022 华中知识产权网 版权所有  备案号:京ICP备12018864号-26   联系邮箱:2 913 236 @qq.com