2009-05-29 5 views
5

मेरे पास एक लाइव डेटाबेस है जिसमें से कुछ डेटा हटा दिया गया है और मुझे उस डेटा को वापस चाहिए। मेरे पास उस डेटाबेस की एक बहुत ही हाल की प्रति है जिसे पहले से ही किसी अन्य मशीन पर बहाल कर दिया गया है। बैकअप के बाद से लाइव डेटाबेस में असंबंधित परिवर्तन किए गए हैं, इसलिए मैं पूर्ण डेटाबेस के साथ लाइव डेटाबेस को मिटा नहीं देना चाहता हूं।मैं SQL सर्वर डेटाबेस बैकअप से डेटा के एक छोटे से हिस्से को कैसे बचा सकता हूं?

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

आदर्श रूप से मैं डेटाबेस की बैकअप प्रतिलिपि मुझे दर्जन पंक्तियों का चयन करने के लिए, और उन सभी चीज़ों के ट्रांजिटिव क्लोजर का चयन करने में सक्षम हूं, जो उन पर निर्भर करता है, और जो कुछ भी उन पर निर्भर करता है, और केवल उस डेटा को निर्यात करता है, जिसे मैं किसी अन्य चीज़ को छूए बिना लाइव डेटाबेस में आयात कर सकता हूं।

यहां लेने का सबसे अच्छा तरीका क्या है? धन्यवाद।

हर किसी ने sp_generate_inserts का उल्लेख किया है। इसका उपयोग करते समय, आप पहचान कॉलम को सबकुछ खराब करने से कैसे रोकते हैं? क्या आप सिर्फ पहचान इन्टरनेट चालू करते हैं?

+0

+1, शुभकामनाएं! –

उत्तर

1

मैंने पहले इसी तरह की स्थितियों में भाग लिया है, लेकिन पाया कि हाथ से ऐसा करने से मेरे लिए सबसे अच्छा काम करता है।

मैंने बैकअप को दूसरे सर्वर पर बहाल किया और मेरी क्वेरी को मुझे आवश्यक जानकारी प्राप्त करने के लिए किया, फिर मैं sp_generate_inserts डेटा डालने के लिए एक स्क्रिप्ट तैयार करता हूं और फिर मेरी प्रत्येक तालिका के लिए बार-बार पंक्तियों को दोहराता हूं।

कुल मिलाकर कुल मिलाकर मेरे पास 2 अन्य तालिकाओं में संबंधपरक डेटा के साथ लगभग 10 मास्टर रिकॉर्ड थे। यह सब कुछ वापस पाने के लिए मुझे केवल एक घंटे लग गया।

अद्यतन sp_generate_inserts के बारे में आपके प्रश्न का उत्तर करने के लिए, जब तक आप @ मालिक = 'dbo' द्वारा बताए गए अनुसार, उस पर करने के लिए पहचान डालने सेट और फिर यह आप के लिए स्क्रिप्ट के अंत में बंद करने के लिए सेट हो जाएगा।

+0

मैं सफल रहा था। sp_generate_inserts सहायक है, लेकिन यह विफल रहता है (जैसा कि यह कहता है) टेबल पर उन स्तंभों और टेबलों के साथ nvarchar कॉलम के साथ। और, आप अपने WHERE खंड के लिए 128 वर्ण तक सीमित हैं। नतीजतन, मुझे हर टेबल के लिए मैन्युअल रूप से कम से कम एक चीज करना पड़ा। –

1

आपको हाथ से बहाल करना होगा। sp_generate_inserts नए डेटा के लिए अच्छा है। लेकिन डेटा अद्यतन करने के लिए मैं इसे इस तरह से कार्य करें:

SELECT 'Update YourTable ' 
    +'SET Column1='+COALESCE(''''+CONVERT(varchar,Column1Name)+'''','NULL') 
    +', Column2='+COALESCE(''''+CONVERT(varchar,Column2Name)+'''','NULL') 
    +' WHERE Key='+COALESCE(''''+CONVERT(varchar,KeyColumn)+'''','NULL') FROM backupserver.databasename.owner.YourTable 

आप आवेषण इस तरह से भी बना सकते हैं, लेकिन sp_generate_inserts बेहतर है। उन पहचान मानों को देखें, और शुभकामनाएं (मुझे पहले यह समस्या हुई है और पता है कि आप अभी कहां हैं)।

उपयोगी प्रश्नों:

--find out if there are missing rows, and which ones 
SELECT 
    b.key,c.key 
    from backupserver.databasename.owner.YourTable b 
     LEFT OUTER JOIN YourTable     c ON b.key=c.key 
    WHERE c.Key is NULL 

--find differences 
SELECT 
    b.key,c.key 
    from YourTable            c 
     LEFT OUTER JOIN backupserver.databasename.owner.YourTable b ON c.key=b.key 
    WHERE b.Key is not null 
     AND ( ISNULL(c.column1,-9999)  != ISNULL(b.column1,-9999) 
      OR ISNULL(c.column2,'~')  != ISNULL(b.column2,'~') 
      OR ISNULL(c.column2,GETDATE()) != ISNULL(b.column2,GETDATE()) 
      ) 
0

एसक्यूएल के लिए SQL सर्वर प्रबंधन स्टूडियो सर्वर 2008 आप डालने बयान के रूप में तालिका डेटा निर्यात करने की अनुमति देता है। http://www.kodyaz.com/articles/sql-server-script-data-with-generate-script-wizard.aspx देखें। इस दृष्टिकोण में sp_generate_inserts की कुछ लचीलापन की कमी है (उदाहरण के लिए, आप अपनी तालिका में पंक्तियों को फ़िल्टर करने के लिए WHERE क्लॉज निर्दिष्ट नहीं कर सकते हैं) लेकिन यह अधिक विश्वसनीय हो सकता है क्योंकि यह उत्पाद का हिस्सा है।

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