[英]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。
因此,我想出了第二個查詢來嘗試確定結束時間。 首先,我很抱歉這很丑陋,而且瘋狂地嵌套。
下面的查詢假定以下內容:
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.