Um die Datenbank zu Zeit RESTORE, ich habe herausgefunden, dass finden Sie diese Abfrage verwenden können:
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;
Der Nachteil ist, werden Sie feststellen, dass, zumindest auf meinem Test-Server, ist die EndTime
immer NULL .
Also kam ich mit einer zweiten Abfrage, um zu versuchen, die Endzeit zu bestimmen. Vor allem entschuldige ich mich, dass dies ziemlich hässlich und verschachtelt ist.
Die Abfrage unter nimmt die folgenden:
- Wenn eine Wiederherstellung ausgeführt wird, für die DatabaseID und ClientProcessID, der nächste EventSequence enthält die TransactionID wir brauchen.
- Ich gehe dann und finde die maximale EventSequence für die Transaktion
- Schließlich wähle ich den Datensatz, der
RESTORE DATABASE
enthält und die maximale Transaktion mit diesem Datensatz verbunden ist.
Ich bin sicher, dass jemand kann wohl nehmen, was ich habe es getan und verfeinern, aber das ist in meiner Testumgebung zu arbeiten:
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
ich einige gemacht Änderungen an der Abfrage, da eine der Testdatenbanken die Groß-/Kleinschreibung berücksichtigt und einige Datensätze verloren hat. Ich habe auch bemerkt, wenn von der Festplatte wiederherstellen, die DatabaseID
null ist, also bin ich Umgang dass jetzt auch:
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
Das ist großartig. Ich werde das so bald wie möglich auf meinem Server (n) ausführen – edosoft
Die erste Abfrage gibt tatsächlich die Startzeit der Wiederherstellungen zurück, die zweite Abfrage gibt nichts zurück, möglicherweise aufgrund eines Joins. Ich untersuche ... – edosoft
Die einzige Sache, die in den Sinn kommt, ist, wenn die Datenbank-IDs nicht übereinstimmten (weil sie null waren) - hoffentlich werden meine Änderungen für Sie arbeiten. – LittleBobbyTables