簡體   English   中英

如何查詢SQL Server數據庫還原需要多少時間?

[英]How can I query how much time a SQL server database restore takes?

我正在嘗試編寫一個查詢,該查詢將告訴我在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 ,但該msdb..backupset保存備份的開始和結束日期,而不是還原。

您知道在哪里查詢還原的開始和結束時間嗎?

為了找到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的記錄以及與該記錄關聯的最大事務。

我確定有人可能會接受我所做的工作並對其進行完善,但這似乎可以在我的測試環境中工作:

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為null,因此我現在也處理該問題:

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 

做一個工作。 然后將其作為作業運行。 然后檢查查看作業歷史記錄。 然后查看工期列。

在運行時,您可以檢查類似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 Randal。 我知道他有時會檢查服務器故障,但不知道他是否想知道StackOverflow。

選擇* from fn_dblog(NULL,NULL)

希望這可以幫助。 如果您設法使用它並找到解決方案,請告訴我們。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM