Để tìm RESTORE DATABASE thời gian, tôi đã phát hiện ra rằng bạn có thể sử dụng truy vấn này:
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;
Nhược điểm là, bạn sẽ nhận thấy rằng, ít nhất là trên máy chủ thử nghiệm của tôi, EndTime
luôn là NULL .
Vì vậy, tôi đã đưa ra một truy vấn thứ hai để thử và xác định thời gian kết thúc. Trước hết, tôi xin lỗi rằng điều này là khá xấu xí và lồng nhau như điên.
Các truy vấn dưới đây giả định như sau:
- Khi khôi phục được điều hành, cho rằng DatabaseID và ClientProcessID, các EventSequence tiếp theo chứa các transactionId chúng ta cần.
- Sau đó tôi đi và tìm EventSequence tối đa cho Giao dịch
- Cuối cùng, tôi chọn bản ghi có chứa
RESTORE DATABASE
và giao dịch tối đa được liên kết với hồ sơ đó.
tôi chắc chắn rằng một người nào đó có lẽ có thể lấy những gì tôi đã thực hiện và hoàn thiện nó, nhưng điều này dường như làm việc trên môi trường thử nghiệm của tôi:
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
tôi thực hiện một số thay đổi đối với truy vấn, vì một trong các cơ sở dữ liệu thử nghiệm mà tôi đã sử dụng phân biệt chữ hoa chữ thường và nó đã mất một số bản ghi. Tôi cũng nhận thấy khi khôi phục từ đĩa rằng DatabaseID
là null, vì vậy tôi xử lý mà bây giờ cũng như:
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
Thật tuyệt vời. Tôi sẽ chạy asap này trên máy chủ của tôi (s) – edosoft
Truy vấn đầu tiên thực sự trả về thời gian bắt đầu của khôi phục, truy vấn thứ hai trả về không có gì, có thể do tham gia. Tôi đang điều tra ... – edosoft
Điều duy nhất có trong đầu là nếu ID cơ sở dữ liệu không khớp nhau (vì chúng không có giá trị) - hy vọng các chỉnh sửa của tôi sẽ hoạt động cho bạn. – LittleBobbyTables