मुझे एक डेटाबेस को पुनर्प्राप्त करने का प्रयास करने का काम सौंपा गया है जो भ्रष्टाचार से पीड़ित था (I / O की विफलता के कारण, जो तब से तय हो गया है)। मैं डेटाबेस से परिचित नहीं हूँ या इसमें क्या है।
मुझे एक पुराना (~ 3 सप्ताह) पूर्ण बैकअप दिया गया है और लेन-देन लॉग की एक श्रृंखला है ... हालांकि लापता लेनदेन लॉग हैं, इसलिए मैं केवल एक निश्चित तिथि तक ही पुनर्प्राप्त कर सकता हूं। 2.5 सप्ताह का डेटा गायब है (और लगातार इस डेटाबेस में बहुत सारा डेटा जोड़ा जा रहा है)।
मुझे भ्रष्ट डेटाबेस की एक प्रति भी दी गई है (जो कि सुलभ है, लेकिन बहुत सारे पृष्ठ भ्रष्ट / गायब हैं)।
मैंने सामान्य DBCC CHECKDB
आदेशों की कोशिश की है (फिर भी नहीं repair_allow_data_loss
, यह मेरा अंतिम उपाय होगा यदि कुछ और काम नहीं करता)।
कई आने के बाद और डेटाबेस में जाता है (डीबी एक 1.5 टेराबाइट वाला छोटा राक्षस है और मैं जो कुछ भी करता हूं वह धीमा है और थोड़ी देर लगता है), मैंने भ्रष्ट पृष्ठों के लिए अंतिम ज्ञात अच्छे बैकअप से एक ऑनलाइन पेज को पुनर्स्थापित करने की कोशिश की है।
ऐसा करने के लिए, मैंने एक स्क्रिप्ट बनाई है जो आउटपुट RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
से कई कमांड्स बनाती है DBCC CHECKDB
(बेज़िकली एक रेग्क्स और एक अलग) ... अब तक अच्छा, यह एक बिंदु तक काम करता था जहां यह कहा जाता था कि मैं 1000 पृष्ठों की सीमा तक पहुंच गया हूं प्रति फ़ाइल (इस db पर 8 फाइलें हैं) प्रति पुनर्स्थापना आदेश।
तो यह मुझे "ऑनलाइन पुनर्स्थापना को पूरा करने" के लिए कहता है, लेकिन मैं ऐसा करने के नुकसान पर हूं ... मेरे पास एक पूंछ लॉग या पूर्ण बैकअप की तुलना में अधिक पूर्ण कुछ भी नहीं है जो मैं शुरू कर रहा हूं, इसलिए मैं मूल रूप से बाकी पृष्ठों के साथ प्रयास करते रहने के लिए पुनर्स्थापना को पूरा करने का तरीका नहीं जानता।
मैंने कोशिश की है, RESTORE DATABASE <foo> WITH RECOVERY
लेकिन यह भी काम नहीं किया, यह मुझे एक लॉग के लिए पूछता है जो मेरे पास नहीं है।
क्या किसी के पास कोई सुझाव है कि मैं कैसे यहां से कुछ भी ठीक करने की कोशिश कर सकता हूं? या ऑनलाइन पुनर्स्थापना को "पूरा" कैसे करें ताकि मैं अधिक पृष्ठों को पुनर्प्राप्त करने के लिए प्रयास कर सकूं? यदि मैं एक ऑफ़लाइन पुनर्स्थापना (मूल रूप WITH NORECOVERY
से सब कुछ जोड़ने और फिर इसे अंत में वापस लाने का प्रयास करता हूं) तो क्या मुझे भी यही समस्या होगी ?
डेटाबेस को हाथ से काम करना मूल रूप से अवांछनीय है ... लाखों पंक्तियों के साथ सैकड़ों टेबल हैं और इसका कोई स्पष्ट अर्थ नहीं है कि इसमें से कोई भी क्या है। भ्रष्ट डीबी SELECT
कुछ मिलियन पंक्तियों के बाद प्रश्नों पर विफल हो जाएगा लेकिन मुझे यकीन नहीं है कि मैं कहां काम कर सकता हूं। मैंने सभी गैर-संकुलित अनुक्रमित के पुनर्निर्माण की कोशिश की है, लेकिन पंक्ति डेटा वाले भ्रष्ट पृष्ठ हैं, इसलिए यह भी काम नहीं किया।
कुछ डेटा हानि स्वीकार्य होगी, लेकिन डीबी पर स्थिरता कम से कम हासिल करने की कोशिश करनी चाहिए।
भ्रष्ट डेटाबेस -still- ऑनलाइन है और ग्राहक इस पर काम कर रहे हैं (इसलिए यह नया डेटा प्राप्त करता रहता है), इसलिए मैं लैब बेंच पर जो भी प्रक्रिया करता हूं, उसे प्रोडक्शन डेटाबेस पर बाद में पुन: पेश करना चाहिए (डाउनटाइम इसके लिए कठिन होगा)।
यह SQL Server 2014 एंटरप्राइज़ है
पुनश्च: मैं कोई डीबीए नहीं हूं ... मैं एक प्रोग्रामर हूं, लेकिन क्लाइंट ने कुछ "विशेषज्ञ" एसक्यूएल आपदा रिकवरी सेवाओं की कोशिश की है और उन्होंने हार मान ली है, इसलिए मुझे इसे देखने और देखने के लिए कहा गया है कि क्या मैं कर सकता हूं कुछ भी करो।
अपडेट : कई परीक्षणों के बाद, पेज रिस्टोर करने वाला पेज नो-गो था, इसलिए हमने विचार को खो दिया है। हम एक मैन्युअल रिकवरी के लिए जा रहे हैं (मैन्युअल रूप से भ्रष्ट तालिकाओं से लापता रिकॉर्ड का चयन करना और उन्हें अंतिम ज्ञात अच्छे बैकअप में सम्मिलित करना), इसके लिए कुछ स्वचालित उपकरण करना (फिर से, सैकड़ों और सैकड़ों टेबल हैं)।