trovare il tempo RESTORE DATABASE, ho scoperto che è possibile utilizzare questa query:
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;
Il rovescio della medaglia è, si noterà che, almeno sul mio server di prova, il EndTime
è sempre nullo .
Quindi, mi è venuta una seconda query per cercare di determinare l'ora di fine. Prima di tutto, mi scuso che questo è abbastanza brutto e nidificato come un matto.
La query di seguito assume il seguente:
- Quando un ripristino viene eseguito, per quella DatabaseID e ClientProcessID, il prossimo EventSequence contiene il TransactionID abbiamo bisogno.
- Vado quindi a cercare il massimo EventSequence per la transazione
- Infine, seleziono il record che contiene
RESTORE DATABASE
e la transazione massima associata a tale record.
Sono sicuro che qualcuno probabilmente può prendere quello che ho fatto e perfezionare, ma questo sembra lavorare sul mio ambiente di test:
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
EDIT
ho fatto un po ' modifiche alla query, poiché uno dei database di test che ho usato è sensibile al maiuscolo/minuscolo e stava perdendo alcuni record. Ho anche notato durante il ripristino da disco che la DatabaseID
è nullo, quindi sono la manipolazione che ora così:
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
È fantastico. Eseguirò questo al più presto sul mio server (s) – edosoft
La prima query restituisce effettivamente l'ora di inizio dei ripristini, la seconda query non restituisce nulla, forse a causa di un join. Sto investigando ... – edosoft
L'unica cosa che viene in mente è se gli ID del database non corrispondevano (perché erano nulli) - si spera che le mie modifiche funzionino per te. – LittleBobbyTables