7

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

restorehistorybackup_set_idにリンクする列がありますが、復元ではなくバックアップmsdb..backupsetの開始日と終了日を保持します。

復元の開始時刻と終了時刻をどこで照会するかについてのアイデアはありますか?

4

3 に答える 3

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 であることです。

そこで、終了時刻を特定するための 2 番目のクエリを考え出しました。まず最初に、これがかなり見苦しく、狂ったように入れ子になっていることをお詫びします。

以下のクエリは、次のことを前提としています。

  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

編集

私が使用したテスト データベースの 1 つは大文字と小文字が区別され、一部のレコードが失われていたため、クエリにいくつかの変更を加えました。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 
于 2010-09-30T14:15:58.013 に答える
5

ジョブにします。次に、それをジョブとして実行します。次に、[ジョブ履歴の表示] を確認します。次に、期間の列を見てください。

于 2010-09-24T20:02:08.563 に答える
4

実行中に、この 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 です。彼が時々 Server Fault をチェックすることは知っていますが、彼が StackOverflow を不思議に思っているかどうかはわかりません。

select * from fn_dblog(NULL,NULL)

お役に立てれば。これをなんとか使用して解決策を見つけた場合は、お知らせください。

幸運を!

于 2010-10-05T15:41:42.423 に答える