para encontrar el tiempo RESTORE DATABASE, he encontrado que se puede utilizar esta consulta:
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;
La desventaja es, usted notará que, al menos en mi servidor de prueba, el EndTime
siempre es NULL .
Entonces, se me ocurrió una segunda consulta para tratar de determinar la hora de finalización. Antes que nada, me disculpo porque esto es bastante feo y anidado como loco.
La consulta siguiente se supone lo siguiente:
- Cuando una restauración se ejecuta, para que DatabaseID y ClientProcessID, el siguiente EventSequence contiene TransactionID que necesitamos.
- Luego, voy y encuentro el máximo EventSequence para la transacción
- Finalmente, selecciono el registro que contiene
RESTORE DATABASE
y la transacción máxima asociada con ese registro.
estoy seguro de que alguien probablemente puede tomar lo que he hecho y refinarlo, pero esto parece funcionar en mi entorno de prueba:
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
EDITAR
hice un poco cambios en la consulta, ya que una de las bases de datos de prueba que utilicé distingue entre mayúsculas y minúsculas y estaba perdiendo algunos registros. También me di cuenta al restaurar desde el disco que la DatabaseID
es nula, por lo que estoy manejando ahora así:
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
Eso es asombroso. Lo ejecutaré lo antes posible en mi (s) servidor (es) – edosoft
La primera consulta realmente devuelve la hora de inicio de las restauraciones, la segunda consulta no devuelve nada, tal vez debido a una unión. Estoy investigando ... – edosoft
Lo único que me viene a la mente es si las ID de la base de datos no coincidían (porque eran nulas); espero que mis ediciones funcionen para usted. – LittleBobbyTables