如何查询SQL Server数据库还原所需的时间?

时间:2010-09-23 08:59:53

标签: sql-server sql-server-2008 restore database-restore

我正在尝试编写一个查询,告诉我在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,但保留备份的开始日期和结束日期而不是还原。

知道在哪里查询恢复的开始和结束时间?

3 个答案:

答案 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。

所以,我想出了第二个查询来尝试确定结束时间。首先,我很抱歉这很丑陋并且像疯了一样嵌套。

以下查询假设如下:

  1. 运行还原时,对于该DatabaseID和ClientProcessID,下一个EventSequence包含我们需要的TransactionID。
  2. 然后我找到了事务的最大EventSequence
  3. 最后,我选择包含RESTORE DATABASE的记录以及与该记录关联的最大事务。
  4. 我确信有人可能会采取我已经完成的工作并对其进行改进,但这似乎适用于我的测试环境:

    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)

希望这会有所帮助。 如果您设法使用此功能并找到解决方案,请告诉我们。

祝你好运!