Pour trouver le RESTORE temps DATABASE, j'ai trouvé que vous pouvez utiliser cette requête:
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;
L'inconvénient est, vous remarquerez que, au moins sur mon serveur de test, le EndTime
est toujours NULL . Donc, je suis venu avec une deuxième requête pour essayer de déterminer l'heure de fin. Tout d'abord, je m'excuse que c'est assez moche et imbriqué comme un fou.
La requête ci-dessous suppose ce qui suit:
- Lorsqu'une restauration est exécuté, pour que DatabaseID et ClientProcessID, la prochaine EventSequence contient le TransactionID nous avons besoin.
- Ensuite, je vais trouver le maximum EventSequence pour la transaction
- Enfin, je sélectionne l'enregistrement qui contient
RESTORE DATABASE
et la transaction maximale associée à cet enregistrement.
Je suis sûr que quelqu'un peut probablement prendre ce que je l'ai fait et l'affiner, mais cela semble fonctionner sur mon environnement de 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
J'ai fait quelques modifications apportées à la requête, car l'une des bases de données de test que j'ai utilisées est sensible à la casse et perdait certains enregistrements. J'ai aussi remarqué lors de la restauration à partir du disque que la DatabaseID
est nulle, donc je me occupe maintenant ainsi:
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
C'est génial. Je vais lancer ceci dès que possible sur mon/mes serveur (s) – edosoft
La première requête renvoie en effet l'heure de début des restaurations, la deuxième requête ne renvoie rien, peut-être en raison d'une jointure. J'étudie ... – edosoft
La seule chose qui vient à l'esprit est si les ID de base de données ne correspondaient pas (parce qu'ils étaient null) - j'espère que mes modifications fonctionneront pour vous. – LittleBobbyTables