2010-09-23 13 views
7

इम एक प्रश्न है कि मुझे बताएगा कितना समय एक (पूर्ण या लॉग इन करें) बहाल एसक्यूएल सर्वर पर ले लिया है 2008मैं कैसे क्वेरी कर सकता हूं कि SQL सर्वर डेटाबेस पुनर्स्थापना कितना समय लेता है?

मैं पता लगाने के लिए कितना समय बैकअप ले लिया इस क्वेरी चला सकते हैं लिखने की कोशिश कर:

select database_name, 
     [uncompressed_size] = backup_size/1024/1024, 
     [compressed_size] = compressed_backup_size/1024/1024, 
     backup_start_date, 
     backup_finish_date, 
     datediff(s,backup_start_date,backup_finish_date) as [TimeTaken(s)], 
from msdb..backupset b 
where type = 'L' -- for log backups 
order by b.backup_start_date desc 

इस क्वेरी मुझे क्या पुनर्स्थापित किया जाता है बता देंगे, लेकिन अब यह कितना समय ले लिया:

select * from msdb..restorehistory 

restorehistory एक स्तंभ backup_set_id जो 0 से लिंक होगा है, लेकिन यह बैकअप के लिए प्रारंभ और समाप्ति तिथि को पुनर्स्थापित नहीं करता है।

किसी भी विचार को पुनर्स्थापित करने के लिए प्रारंभ और समाप्ति समय कहां से पूछना है?

उत्तर

12

डेटाबेस समय पुनर्स्थापित ढूंढने के लिए, मैं ने पाया है कि आप इस क्वेरी का उपयोग कर सकते हैं:

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 हमेशा शून्य है ।

तो, मैं अंत समय की कोशिश करने और निर्धारित करने के लिए दूसरी क्वेरी के साथ आया था। सबसे पहले, मैं क्षमा चाहता हूं कि यह बहुत बदसूरत और पागल की तरह घोंसला है।

  1. जब एक बहाल चलाया जाता है, कि DatabaseID और ClientProcessID के लिए, अगले EventSequence शामिल transactionId हम की जरूरत है:

    नीचे दिए गए क्वेरी निम्नलिखित मान लिया गया है।

  2. मैं फिर लेनदेन
  3. के लिए अधिकतम ईवेंट सबक्वेंस पाता हूं और अंत में, मैं उस रिकॉर्ड का चयन करता हूं जिसमें 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 
+0

यह कमाल है। मैं अपने सर्वर (ओं) – edosoft

+0

पर इस एप को चलाऊंगा, पहली क्वेरी वास्तव में पुनर्स्थापना के प्रारंभ समय को लौटाती है, दूसरी क्वेरी कुछ भी नहीं लौटाती है, शायद इसमें शामिल होने के कारण। मैं जांच कर रहा हूं ... – edosoft

+0

एकमात्र चीज जो दिमाग में आती है वह यह है कि यदि डेटाबेस आईडी मेल नहीं खा रहे थे (क्योंकि वे शून्य थे) - उम्मीद है कि मेरे संपादन आपके लिए काम करेंगे। – LittleBobbyTables

5

इसे एक नौकरी बनाएं। फिर इसे नौकरी के रूप में चलाएं। फिर देखें नौकरी इतिहास देखें। फिर अवधि कॉलम देखें।

+0

धन्यवाद। क्या यह वास्तव में एकमात्र तरीका है? मुझे यह विश्वास करना मुश्किल लगता है कि SQL सर्वर इस जानकारी को कहीं भी संग्रहीत नहीं करता है .. – edosoft

+0

एकमात्र तरीका नहीं है; बस एक आसान तरीका है जो आपको समय के साथ मतभेदों को ट्रैक करने की अनुमति देता है, क्योंकि सिस्टम समय के लिए नौकरी इतिहास संग्रहीत करता है। –

3

यह आप इस DMV की तरह कुछ की जांच कर सकते चल रहा हो।

select 
d.name 
,percent_complete 
,dateadd(second,estimated_completion_time/1000, getdate()) 
, Getdate() as now 
,datediff(minute, start_time 
, getdate()) as running 
, estimated_completion_time/1000/60 as togo 
,start_time 
, command 
from sys.dm_exec_requests req 
inner join sys.sysdatabases d on d.dbid = req.database_id 
where 
req.command LIKE '%RESTORE%' 

या आप कुछ जादू वूडू का उपयोग करें और निम्न तालिका समारोह में लेन-देन लॉग व्याख्या, हालांकि केवल एक ही व्यक्ति मैं जानता हूँ कि इस लॉग में किसी भी जानकारी को समझने के लिए कर सकते हैं पॉल रैंडल है। मुझे पता है कि वह कभी-कभी सर्वर फॉल्ट की जांच करता है, लेकिन यह नहीं जानता कि वह स्टैक ओवरफ्लो आश्चर्य करता है या नहीं।

fn_dblog (शून्य, शून्य)

आशा इस मदद करता है से * चुनें। यदि आप इसका उपयोग करते हैं और समाधान ढूंढते हैं तो कृपया हमें बताएं।

शुभकामनाएं!

संबंधित मुद्दे

 संबंधित मुद्दे