डेटाबेस समय पुनर्स्थापित ढूंढने के लिए, मैं ने पाया है कि आप इस क्वेरी का उपयोग कर सकते हैं:
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;
नकारात्मक पक्ष यह है, आपको पता चलेगा कि, कम से कम अपने परीक्षण सर्वर पर, EndTime
हमेशा शून्य है ।
तो, मैं अंत समय की कोशिश करने और निर्धारित करने के लिए दूसरी क्वेरी के साथ आया था। सबसे पहले, मैं क्षमा चाहता हूं कि यह बहुत बदसूरत और पागल की तरह घोंसला है।
- जब एक बहाल चलाया जाता है, कि DatabaseID और ClientProcessID के लिए, अगले EventSequence शामिल transactionId हम की जरूरत है:
नीचे दिए गए क्वेरी निम्नलिखित मान लिया गया है।
- मैं फिर लेनदेन
- के लिए अधिकतम ईवेंट सबक्वेंस पाता हूं और अंत में, मैं उस रिकॉर्ड का चयन करता हूं जिसमें
RESTORE DATABASE
और उस रिकॉर्ड से जुड़े अधिकतम लेनदेन शामिल हैं।
मुझे यकीन है कि किसी को शायद ले जा सकते हैं मैं क्या किया है और इसे परिष्कृत कर रहा हूँ, लेकिन यह अपने परीक्षण पर्यावरण पर काम करने के लिए प्रकट होता है:
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
संपादित
मैं कुछ बनाया क्वेरी में परिवर्तन, क्योंकि मैंने उपयोग किए गए परीक्षण डेटाबेस में से एक केस-संवेदी है और यह कुछ रिकॉर्ड खो रहा था। मैंने यह भी देखा है जब डिस्क कि DatabaseID
रिक्त है से बहाल करने, इसलिए मुझे लगता है कि अब भी निपटने हूँ:
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
यह कमाल है। मैं अपने सर्वर (ओं) – edosoft
पर इस एप को चलाऊंगा, पहली क्वेरी वास्तव में पुनर्स्थापना के प्रारंभ समय को लौटाती है, दूसरी क्वेरी कुछ भी नहीं लौटाती है, शायद इसमें शामिल होने के कारण। मैं जांच कर रहा हूं ... – edosoft
एकमात्र चीज जो दिमाग में आती है वह यह है कि यदि डेटाबेस आईडी मेल नहीं खा रहे थे (क्योंकि वे शून्य थे) - उम्मीद है कि मेरे संपादन आपके लिए काम करेंगे। – LittleBobbyTables