我正在尝试编写一个查询,告诉我在SQL Server 2008上恢复(完整或日志)的时间。
我可以运行此查询以了解备份花了多少时间:
select database_name,
[uncompressed_size] = backup_size/1024/1024,
[compressed_size] = compressed_backup_size/1024/1024,
backup_start_date,
backup_finish_date,
datediff(s,backup_start_date,backup_finish_date) as [TimeTaken(s)],
from msdb..backupset b
where type = 'L' -- for log backups
order by b.backup_start_date desc
此查询会告诉我已恢复的内容,但现在花了多少时间:
select * from msdb..restorehistory
restorehistory
有一列backup_set_id
,它会链接到msdb..backupset
,但保留备份的开始日期和结束日期而不是还原。
知道在哪里查询恢复的开始和结束时间?
答案 0 :(得分:12)
要查找RESTORE DATABASE时间,我发现您可以使用此查询:
declare @filepath nvarchar(1000)
SELECT @filepath = cast(value as nvarchar(1000)) FROM [fn_trace_getinfo](NULL)
WHERE [property] = 2 and traceid=1
SELECT *
FROM [fn_trace_gettable](@filepath, DEFAULT)
WHERE TextData LIKE 'RESTORE DATABASE%'
ORDER BY StartTime DESC;
缺点是,您会注意到,至少在我的测试服务器上,EndTime
始终为NULL。
所以,我想出了第二个查询来尝试确定结束时间。首先,我很抱歉这很丑陋并且像疯了一样嵌套。
以下查询假设如下:
RESTORE DATABASE
的记录以及与该记录关联的最大事务。我确信有人可能会采取我已经完成的工作并对其进行改进,但这似乎适用于我的测试环境:
declare @filepath nvarchar(1000)
SELECT @filepath = cast(value as nvarchar(1000)) FROM [fn_trace_getinfo](NULL)
WHERE [property] = 2 and traceid=1
SELECT *
FROM [fn_trace_gettable](@filepath, DEFAULT) F5
INNER JOIN
(
SELECT F4.EventSequence MainSequence,
MAX(F3.EventSequence) MaxEventSequence, F3.TransactionID
FROM [fn_trace_gettable](@filepath, DEFAULT) F3
INNER JOIN
(
SELECT F2.EventSequence, MIN(TransactionID) as TransactionID
FROM [fn_trace_gettable](@filepath, DEFAULT) F1
INNER JOIN
(
SELECT DatabaseID, SPID, StartTime, ClientProcessID, EventSequence
FROM [fn_trace_gettable](@filepath, DEFAULT)
WHERE TextData LIKE 'RESTORE DATABASE%'
) F2 ON F1.DatabaseID = F2.DatabaseID AND F1.SPID = F2.SPID
AND F1.ClientProcessID = F2.ClientProcessID
AND F1.StartTime > F2.StartTime
GROUP BY F2.EventSequence
) F4 ON F3.TransactionID = F4.TransactionID
GROUP BY F3.TransactionID, F4.EventSequence
) F6 ON F5.EventSequence = F6.MainSequence
OR F5.EventSequence = F6.MaxEventSequence
ORDER BY F5.StartTime
修改强>
我对查询进行了一些更改,因为我使用的其中一个测试数据库区分大小写并且丢失了一些记录。我还注意到从磁盘恢复时DatabaseID
为空,所以我现在也在处理它:
SELECT *
FROM [fn_trace_gettable](@filepath, DEFAULT) F5
INNER JOIN
(
SELECT F4.EventSequence MainSequence,
MAX(F3.EventSequence) MaxEventSequence, F3.TransactionID
FROM [fn_trace_gettable](@filepath, DEFAULT) F3
INNER JOIN
(
SELECT F2.EventSequence, MIN(TransactionID) as TransactionID
FROM [fn_trace_gettable](@filepath, DEFAULT) F1
INNER JOIN
(
SELECT DatabaseID, SPID, StartTime, ClientProcessID, EventSequence
FROM [fn_trace_gettable](@filepath, DEFAULT)
WHERE upper(convert(nvarchar(max), TextData))
LIKE 'RESTORE DATABASE%'
) F2 ON (F1.DatabaseID = F2.DatabaseID OR F2.DatabaseID IS NULL)
AND F1.SPID = F2.SPID
AND F1.ClientProcessID = F2.ClientProcessID
AND F1.StartTime > F2.StartTime
GROUP BY F2.EventSequence
) F4 ON F3.TransactionID = F4.TransactionID
GROUP BY F3.TransactionID, F4.EventSequence
) F6 ON F5.EventSequence = F6.MainSequence
OR F5.EventSequence = F6.MaxEventSequence
ORDER BY F5.StartTime
答案 1 :(得分:5)
让它成为一份工作。然后将其作为Job运行。然后查看查看作业历史记录。然后查看持续时间列。
答案 2 :(得分:3)
当它正在运行时,您可以检查类似这样的内容。
select
d.name
,percent_complete
,dateadd(second,estimated_completion_time/1000, getdate())
, Getdate() as now
,datediff(minute, start_time
, getdate()) as running
, estimated_completion_time/1000/60 as togo
,start_time
, command
from sys.dm_exec_requests req
inner join sys.sysdatabases d on d.dbid = req.database_id
where
req.command LIKE '%RESTORE%'
或者您可以使用一些魔法伏都教并在下表函数中解释事务日志,但是我知道唯一了解此日志中任何信息的人是Paul Randal。 我知道他有时检查服务器故障,但不知道他是否想知道StackOverflow。
从fn_dblog中选择*(NULL,NULL)
希望这会有所帮助。 如果您设法使用此功能并找到解决方案,请告诉我们。
祝你好运!