iam*_*Zel 9 sql-server-2005 sql-server backup
我有两个备份两个不同数据库的作业。
作业 1 备份 DB1
作业 2 备份 DB2
DB1 由于驱动器 1 上的空间不足导致作业 1 失败而无法备份。为了解决这个问题,我只需要添加空间。没什么大不了的。当这个问题已经发生一个月时,我今天被告知了这一点。是的,我知道这很疯狂,但这是开发人员
我想获得 DB1 的完整备份历史记录。我知道我可以从 msdb.dbo.backupset 表中检索成功的备份信息,但我想知道是否存在显示数据库备份失败的查询。
我下面的查询显示了特定数据库从 12/31/13-1/27/14 的备份历史记录。信息包括服务器、数据库名称、备份开始和结束时间、备份数据库所需的总时间、数据库大小和备份集名称。
SELECT
distinct CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server,
msdb.dbo.backupset.database_name,
msdb.dbo.backupset.backup_start_date,
msdb.dbo.backupset.backup_finish_date,
CAST((DATEDIFF(second, msdb.dbo.backupset.backup_start_date,msdb.dbo.backupset.backup_finish_date)) AS varchar)+ ' secs ' AS [Total Time] ,
Cast(msdb.dbo.backupset.backup_size/1024/1024 AS numeric(10,2)) AS 'Backup Size(MB)',
msdb.dbo.backupset.name AS backupset_name
FROM msdb.dbo.backupmediafamily
INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
--Enter your database below
--and database_name = 'db_name_here'
and msdb.dbo.backupset.backup_start_date>'2013-12-31' and msdb.dbo.backupset.backup_start_date<'2014-01-27 23:59:59'
ORDER BY
msdb.dbo.backupset.database_name,
msdb.dbo.backupset.backup_start_date
Run Code Online (Sandbox Code Playgroud)
有没有办法通过修改我的代码来获取该信息?我可以通过执行针对 sysjobhistory 和 sysjob 表运行的 sql 语句来检索 JOB1 的历史记录。这可能是一个长镜头 有没有办法可以使用 msdb 中的 sysjobhistory、sysjob、backupset 和 backupsetmediafamily 表来产生我想要的结果?
Aar*_*and 15
可悲的是,backupset不包含失败的备份,我不知道msdb这些中的其他任何地方可能会存储,除非您可以依赖sysjobhistory,它不包含所有时间(取决于您的保留设置),并且会忽略任何在作业上下文之外进行的备份尝试,并且在备份多个数据库的作业的情况下,不会区分哪个数据库实际失败,除非它碰巧在作业的早期发生 - 这是因为消息非常冗长但被截断了。
如果您完全知道Job n只备份一个数据库,并且该作业的每次失败都意味着没有备份该数据库(因为备份成功后作业也可能失败,例如尝试缩小或执行其他维护),那么你可以使用这样的查询:
DECLARE @job sysname, @db sysname;
SELECT @job = N'Job 1', @db = N'db_name';
SELECT
bs.database_name,
bs.backup_start_date,
bs.backup_finish_date,
[Total Time] = CAST((DATEDIFF(SECOND, bs.backup_start_date,bs.backup_finish_date))
AS varchar(30))+ ' secs',
CAST(bs.backup_size/1024/1024 AS decimal(10,2)) AS 'Backup Size(MB)',
h.[message]
FROM msdb.dbo.sysjobhistory AS h
INNER JOIN msdb.dbo.sysjobs AS j
ON h.job_id = j.job_id
AND h.step_id = 0
LEFT OUTER JOIN msdb.dbo.backupset AS bs
ON bs.database_name = @db
AND
ABS(DATEDIFF(SECOND, bs.backup_start_date, CONVERT(DATETIME,convert(char(8),h.run_date)
+ ' ' + STUFF(STUFF(RIGHT('0'+CONVERT(char(6),h.run_time),6),3,0,':'),6,0,':')))) < 5
WHERE j.name = @job
ORDER BY bs.backup_start_date;
Run Code Online (Sandbox Code Playgroud)
是的,它真的很难看,因为sysjobhistory在 SQL Server 2014 中,甚至将run_date和存储run_time为单独的整数。我敢打赌,做出这个决定的人仍然是在整个建筑 35 的飞镖板的背景下。它还假设备份是工作的第一步,因此比较不科学的日期/时间来确保我们已经正确将正确的作业实例与正确的备份实例相关联。哦,我多么希望我可以重新设计备份和作业的架构。
如果您希望在作业之外有更广泛的范围,您可以在 SQL Server 错误日志中查找失败的备份(如果它们尚未被循环删除):
EXEC sp_readerrorlog 0, 1, 'BACKUP failed'; -- current
EXEC sp_readerrorlog 1, 1, 'BACKUP failed'; -- .1 (previous)
EXEC sp_readerrorlog 2, 1, 'BACKUP failed'; -- .2 (the one before that)
....
Run Code Online (Sandbox Code Playgroud)
(但我不知道将输出合并到现有查询中的好方法。)
您还可以将“丢失”的成功备份与默认跟踪相关联,例如
DECLARE @path nvarchar(260);
SELECT
@path = REVERSE(SUBSTRING(REVERSE([path]),
CHARINDEX(CHAR(92), REVERSE([path])), 260)) + N'log.trc'
FROM sys.traces
WHERE is_default = 1;
SELECT dt.DatabaseName, dt.StartTime, bs.backup_start_date, bs.backup_finish_date,
[Status] = CASE WHEN bs.backup_start_date IS NULL
THEN 'Probably failed'
ELSE 'Seems like success'
END
FROM sys.fn_trace_gettable(@path, 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 -- backup/restore events
AND UPPER(CONVERT(nvarchar(max),dt.TextData)) LIKE N'BACKUP%DATABASE%'
--AND dt.DatabaseName = N'db_name' -- to filter to a single database
--AND bs.database_name = N'db_name'
ORDER BY dt.StartTime;
Run Code Online (Sandbox Code Playgroud)
当然,这也依赖于默认跟踪循环中的数据、数据库名称未更改等。不幸的是,默认跟踪不区分成功和失败的备份,并且开始时间不会与 MSDB 精确匹配数据,但只要你不是在循环中运行备份,这应该没问题。我试图将这些问题合并到查询中。
最后,您可能想要使用FULL OUTER JOIN那里,以防备份集的历史记录比默认跟踪更长。这[Status]稍微改变了 的语义。
你也可能想试试这个讨厌的东西,虽然我没有太多运气。我只能看到当前或最近的状态,因此只有在作业上次运行失败时才有帮助,并且 - 就像sysjobhistory- 无法获取有关尝试但未通过作业进行的任何备份的信息。