数据库是否成功备份是管理员最重要的工作,一般可以右键单击数据库,然后查看属性,在常规标签就能看到数据库最后一次备份的时间,如下图:
如果你有几十上百个数据库要管理,这样点来点去一天就过去了,通过查询msdb数据库里面的系统视图,我们可以用脚本跑出来:
- USE msdb
- go
- SELECT
- msdb.dbo.backupset.database_name ,
- MAX(msdb.dbo.backupset.backup_finish_date) AS CData
- -- , msdb.dbo.backupmediafamily.physical_device_name AS keb
- FROM msdb.dbo.backupmediafamily
- INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
- WHERE msdb..backupset.type = 'D'
- AND database_name IN ( SELECT NAME
- FROM sys.databases )
- GROUP BY msdb.dbo.backupset.database_name
- --, msdb.dbo.backupmediafamily.physical_device_name
- ORDER BY msdb.dbo.backupset.database_name
database_name CData
AdventureWorks 2010-07-26 15:23:26.000
你注意到代码中的第四行和第十五行被注释掉了,这是是我的环境中的特需需求。我的数据库每天有两个备份,分别由SQL SERVER和第三方备份软件完成,其中SQL SERVER的备份保留时间只有几天,而第三方备份软件备份数据需要保留3个月,我更关心第三方备份软件的情况,第四行和第十五行的内容会告诉你备份数据写到什么地方去了。下面是这两行没有注释的输出:
但是我还没能做到输出的结果包含这三列,而且第一列的值是唯一的,即同一个数据库只给出最后一次备份的时间和备份目标。请代码写的牛逼的哥们出手帮忙。(后面有个不完美的解决办法)
另外,这个代码结合数据库邮件和计划任务可以将备份结果每天定时发送到指定邮箱,这样一来就不用到服务器上执行脚本了,就像下面这样的。
UP
如果你的备份时间是可以预期的,即备份开始的时间和结束的时间能够控制在一个固定的范围内就可以用下面的代码:
- USE msdb
- go
- SELECT msdb.dbo.backupset.database_name ,
- MAX(msdb.dbo.backupset.backup_finish_date) ,
- msdb.dbo.backupmediafamily.physical_device_name
- FROM msdb.dbo.backupmediafamily
- INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
- WHERE msdb..backupset.type = 'D'
- AND database_name IN ( SELECT NAME
- FROM sys.databases )
- AND msdb.dbo.backupset.backup_finish_date > DATEADD(day, -2, GETDATE())
- GROUP BY msdb.dbo.backupset.database_name ,
- msdb.dbo.backupmediafamily.physical_device_name
- ORDER BY msdb.dbo.backupset.database_name
给msdb.dbo.backupset.backup_finish_date一个限制条件,如果你的备份窗口不会跨天,可以将DATEADD(day, -2, GETDATE())的-2改成-1,这样一来就变成了查询job执行时间前面一天的备份情况。
转载于:https://blog.51cto.com/liuxinya/371521