我试图编写一个查询,它将告诉我恢复(完整的或日志)在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..restorehistoryrestorehistory有一个列backup_set_id,它将链接到msdb..backupset,但是它保存备份的开始和结束日期,而不是还原。
知道在哪里查询恢复的开始和结束时间吗?
发布于 2010-09-30 14:15:58
要查找还原数据库时间,我发现您可以使用以下查询:
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始终是空的。
因此,我想出了第二个查询,试图确定结束时间。首先,我很抱歉,这是非常丑陋和嵌套的疯狂。
下面的查询假设如下:
在运行还原时,对于该Transaction
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 发布于 2010-09-24 20:02:08
做一份工作吧。然后以作业的形式运行它。然后检查“查看职务历史记录”。然后查看工期列。
发布于 2010-10-05 15:41:42
当它运行时,您可以检查类似这个dmv的东西。
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。我知道他有时检查服务器故障,但不知道他是否怀疑StackOverflow。
从fn_dblog中选择*(NULL,NULL)
希望这能有所帮助。如果您能够使用这个并找到解决方案,请告诉我们。
祝好运!
https://stackoverflow.com/questions/3776783
复制相似问题