SQL Server数据库判断最近一次的备份执行结果 焦点简讯
博客园 2023-05-09 04:46:44


【资料图】

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:46:44

世界热门:房产经纪人岗位职责(房产经纪人岗位职责)

2023-05-09 02:06:56

摩根大通:债务上限僵局为10年期美债收益率走低提供了支撑|观察

2023-05-08 23:48:59

北欧联合银行:可以确定欧洲央行还会加息

2023-05-08 22:19:58

奔三的女人别再穿裙了,今夏流行时尚裤,美美的_焦点热闻

2023-05-08 21:58:12

蚊子的发育过程经历了_蚊子的发育过程

2023-05-08 21:01:56

我国首次奶用型羊中间试验在西农大甘肃永昌县基地开展|环球热点

2023-05-08 20:12:01

天天视讯!徐霞客游记是哪个朝代(徐霞客游记是哪个朝代的地理学家)

2023-05-08 19:19:58

怎么下载小说到mp4_怎么把小说下载到mp4|环球要闻

2023-05-08 18:53:30

贵州进一步支持缴存职工及多子女家庭租房提取住房公积金_环球看热讯

2023-05-08 18:13:27

观察:200块穿出高级感,通勤就这样穿!

2023-05-08 17:49:54

七十六团试种2000亩食葵

2023-05-08 17:24:13

茂名港开发建设有限公司_关于茂名港开发建设有限公司的简介

2023-05-08 16:54:06

步履维艰|当前播报

2023-05-08 16:06:48

悦舞跳舞毯安装程序_悦舞跳舞毯官网-天天观热点

2023-05-08 16:01:55

佛山居住证办理条件_天天看点

2023-05-08 15:30:15

大观园布局示意图_大观园布局

2023-05-08 14:44:34

海南中学三亚学校高中自主招生方案出炉

2023-05-08 14:25:49

社保基金现身98只科创板股前十大流通股东榜(名单)

2023-05-08 13:49:16

http www com 怎么打不开呢

2023-05-08 13:02:24

云南糖网:5月8日,广西现货市场报价均在7000元/吨之上_世界速递

2023-05-08 12:19:44

dnf剑魂吧护石_dnf剑魂吧

2023-05-08 11:53:22

北京内双怎么做双眼皮好看

2023-05-08 11:16:09

英镑年底或暂跌回1.12美元左右

2023-05-08 10:37:06

天天新动态:亳州市谯城区市场监管局开展打击传销“进商超”宣传活动

2023-05-08 10:05:30

为农村娃传递阅读之美-天天微动态

2023-05-08 09:57:44

公共文化服务与管理专业介绍怎么写_公共文化服务与管理专业介绍

2023-05-08 09:10:35

上市公司,已豪掷千亿押注!

2023-05-08 09:01:06

即时看!末节绝平球+加时制胜3分 英雄哈登赛后还有暖心一幕

2023-05-08 07:54:06

霍布斯的自然状态(霍布斯)

2023-05-08 07:14:20

徐巧芯前进台中挺黄健豪 高喊年轻世代团结

2023-05-08 06:05:24

天天实时:(氢能有哪些龙头股)5家氢能企业股票龙头名单

2023-05-08 04:49:23

广西壮族自治区百色市2023-05-07 23:10发布雷电黄色预警

2023-05-08 01:50:07

全球新消息丨眼圈发黑是怎么回事男_眼圈发黑是怎么回事

2023-05-07 22:49:48

环球微头条丨高考语文必背篇目2022_2020高考语文必背篇目列表

2023-05-07 22:01:44

低压电工证网上查询官网_高压电工证网上查询 天天精选

2023-05-07 20:54:02

天天军棋小游戏7399_天天军棋翻翻棋

2023-05-07 19:45:22

世界简讯:施光南传_关于施光南传介绍

2023-05-07 19:00:53

世界新资讯:鼠标垫怎么洗不影响图案_鼠标垫怎么洗

2023-05-07 17:50:16

华容道游戏在线玩_华容道应该怎么玩

2023-05-07 16:56:21

天天要闻:意甲-本纳赛尔破门特奥世界波 莱奥伤退米兰2-0拉齐奥

2023-05-07 15:59:48

每日短讯:网友自曝小学曾霸凌刘亦菲 称如今看她还要开会员

2023-05-07 15:14:45

世界观察:「昨日战报」海南四海首战4:2告捷!天津津门荣耀遗憾落败!

2023-05-07 14:13:48

国家医保局公布2023年一季度跨省异地就医直接结算情况|世界观察

2023-05-07 13:06:56

许嵩和冯禧稳定交往半年,音乐节暗戳戳秀恩爱,女方堪比大嫂架势_环球热点

2023-05-07 12:49:18

末世之反配为主张晓艺_末世之反配为主

2023-05-07 11:47:45

当前观点:千教万教教人求真千学万学学做真人是谁的教育名言 千教万教教人求真千学万学学做真人

2023-05-07 10:01:53

【世界播资讯】日本综艺节目称程序员年薪150万 业内人士吐槽:太假

2023-05-07 09:12:46

"五一"期间集美区侨英街道以节带促 家门口的商场人气高消费旺

2023-05-07 08:29:12

“一机传三代”,年轻人为啥不换新手机了?

2023-05-07 07:20:36

海南岛是什么时候开始属于中国的? 每日热闻

2023-05-07 06:55:12

正面管教:不凶不吼教出好孩子(关于正面管教:不凶不吼教出好孩子介绍)

2023-05-07 06:04:10

不满足固定资产准则第四条规定_固定资产准则第四条规定

2023-05-07 05:45:51

天天关注:【文化富蕴】书香为伴,富蕴县图书馆邀您共读好书

2023-05-07 03:56:52

食用猪油到底对身体是好还是坏?

2023-05-07 03:02:39

全球信息:秦皇岛游玩攻略_秦皇岛好玩的地方

2023-05-07 01:00:25

湖北城市大项目运维24小时不打烊 世界即时看

2023-05-06 22:51:59

天天要闻:网友被捡走的癌症靶向药已找回事件简单介绍

2023-05-06 21:58:13

世界热消息:【老外在中国•我眼中的新时代】巴铁青年阿德:奋斗创造美好生活

2023-05-06 21:03:20

【环球报资讯】牧原股份:公司生猪养殖完全成本包含生猪养殖、生猪销售过程中发生与承担的所有费用与成本

2023-05-06 20:12:07

环球播报:2023年军队文职人员公开招考第二批免笔试直接面试招考岗位计划表

2023-05-06 19:27:24

4月水果当季有哪些水果

2023-05-06 18:35:53

诵“我们的诗”,金沙小学四年级九班学子当上“小诗人”

2023-05-06 18:04:14

樱桃红了!龙湾屯镇2.5万余公斤设施樱桃抢“鲜”上市-全球观察

2023-05-06 17:26:05

梅河口市农信联社被罚30万:因信贷资产分类不准确|环球焦点

2023-05-06 16:51:50

环球观点:花间绘君颜角色攻略 角色性格和喜好物品推荐

2023-05-06 16:45:20

看热讯:芯智能 心服务 新体验 恒丰银行升级远程银行服务

2023-05-06 16:10:43

天天精选!“挖呀挖呀挖”走红,00后老师“挖”出几套房?本人回应:不存在

2023-05-06 15:44:14

孟华兵 世界新消息

2023-05-06 15:05:27

史上最卷五一回顾:三七、贪玩、诗悦这些游戏加投,腾讯天美、莉莉丝、完美集体熄火,米哈游赢麻? 每日头条

2023-05-06 14:11:10

意大利假期时间表2023_意大利假期2021

2023-05-06 13:55:56

璐穿比基尼海边嬉戏,清纯可爱的她还有饱满身材,太美了

2023-05-06 12:58:20

当前快讯:男子丽江15元买肉夹馍仅少量肉丝,当地回应:正在处理

2023-05-06 12:38:35

今日要闻!沪海关暂扣20辆导航地图有问题的进口车

2023-05-06 11:57:04

MSI日本战队淘汰,引发弹幕狂潮!队内三大韩援,打不过巴西战队

2023-05-06 11:47:22

每日热闻!内蒙古推广智能化育苗播种 省力又提效

2023-05-06 11:29:01

速讯:楼板承重

2023-05-06 11:10:53

副高级工程师评审条件论文_副高级工程师评审条件

2023-05-06 10:16:16

今日热搜:河南防范治理学科类隐形变异培训 每季度开展不少于1次集中整治

2023-05-06 09:32:07

2022年本科院校城市排名,武汉,西安,南京,谁更牛呢?

2023-05-06 09:05:54

内燃机不会被淘汰?继欧盟撤回禁燃令后,丰田加入反禁队伍!-天天消息

2023-05-06 08:49:41

俄瓦格纳集团创始人:瓦格纳部队将于5月10日离开巴赫穆特

2023-05-06 08:01:58

相对误差怎么算excel_相对误差怎么算

2023-05-06 06:57:33

PS 5上的数字艺术家推出VR艺术画廊_每日信息

2023-05-06 06:24:11

成年男子步行平均速度_步行平均速度

2023-05-06 05:13:57

斯迪克(300806):5月5日北向资金减持11.42万股

2023-05-06 03:50:55

全国第四家银泰中心落地!西安商业版图或迎巨变

2023-05-06 01:17:17

柳林县沙曲寄宿制小学:让学生体会完整幸福的教育生活 环球新消息

2023-05-05 23:18:19

古筝演奏家袁莎发行新专辑《出水莲》,琴声展现天人合一之境 热消息

2023-05-05 22:03:32

美国4月就业数据表现好于预期 美元指数短线拉升

2023-05-05 21:23:52

关于G78汕昆高速板江段平安村 1 号高架桥 1 号桥墩冲刷治理等7个工程的公告

2023-05-05 20:56:34

上汽集团4月销售37.4万辆,海外销量增长130.5%

2023-05-05 19:56:29

当前简讯:临平区开展全区宗教领域安全生产大排查大整治行动

2023-05-05 19:23:49

工信部:车辆制造商应建立车辆全生命周期的信息安全管理体系

2023-05-05 18:54:03

烟台联通联合华为首创海域无线覆盖数智化虚拟测试_播资讯

2023-05-05 18:42:11

全球即时:《甜小姐与冷先生》播出时间介绍 甜小姐与冷先生几月几日上线

2023-05-05 18:09:35

胜宏科技:公司订单能见度约1个月|独家

2023-05-05 17:35:13

美股盘前丨业绩超预期!苹果涨超2%,美地区银行股盘前反弹

2023-05-05 17:02:52

视焦点讯!“华龙一号”全球首堆示范工程通过竣工验收

2023-05-05 16:42:39

环球讯息:接了整改通知,南昌南白艺校还是老样子!高新教育中心:进校监督

2023-05-05 16:17:21