edo*_*oft 7 sql-server restore database-restore sql-server-2008
我试着写一个查询,告诉我在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
Run Code Online (Sandbox Code Playgroud)
此查询将告诉我恢复了什么,但现在花了多少时间:
select * from msdb..restorehistory
Run Code Online (Sandbox Code Playgroud)
restorehistory有一个列backup_set_id将链接到msdb..backupset,但保留备份的开始和结束日期而不是还原.
知道在哪里查询恢复的开始和结束时间?
Lit*_*les 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;
Run Code Online (Sandbox Code Playgroud)
缺点是,您会注意到,至少在我的测试服务器上,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
Run Code Online (Sandbox Code Playgroud)
编辑
我对查询进行了一些更改,因为我使用的测试数据库之一是区分大小写的,并且它丢失了一些记录.我还注意到从磁盘恢复时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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29217 次 |
| 最近记录: |