कुशलता से बड़ी राशि (84 मिलियन पंक्तियों) को स्थानांतरित करना


11

मेरी लगभग 84 लाख पंक्तियाँ हैं। उन सभी में से एक ही सर्वर पर एक अलग डेटाबेस में स्थानांतरित करने की आवश्यकता है, फिर मैं स्रोत डेटाबेस से लगभग 60 लाख पंक्तियों को हटाने के लिए हटाता हूं।

84 मिलियन पंक्तियाँ सभी एक ही तालिका में हैं। उस तालिका में पूरे डेटाबेस का 90% हिस्सा है।

इसलिए ... स्रोत: 84 मिलियन पंक्तियाँ -> 24 मिलियन पंक्तियाँ गंतव्य: 0 पंक्तियाँ -> 84 मिलियन पंक्तियाँ

स्रोत पूर्ण पुनर्प्राप्ति मोड चला रहा है, गंतव्य सरल चल रहा होगा।

मैं सोच रहा हूं कि ऐसा करने का सबसे कारगर तरीका क्या होगा?

योजना ए:

1) INSERT INTO गंतव्य का चयन करें * स्रोत से

2) ट्रुनेट स्रोत

3) INSERT INTO स्रोत का चयन करें * गंतव्य से * कहां रखें_काण्ड = 1

वैकल्पिक योजना:

1) गंतव्य डेटाबेस के रूप में स्रोत डेटाबेस का बैकअप पुनर्स्थापित करें

2) गंतव्य डेटाबेस पर आवश्यक एक को छोड़कर हर तालिकाओं को छोड़ें

3) ट्रुनेट स्रोत

4) INSERT INTO स्रोत का चयन करें * गंतव्य से * Keep_condition = 1

योजना सी:

1) INSERT INTO गंतव्य का चयन करें * स्रोत से

2) DELETE स्रोत कहां रखें_कंडिशन = 0

या कुछ और?

धन्यवाद


आप आयात और निर्यात डेटा विज़ार्ड का उपयोग क्यों नहीं करते? यह SQL सर्वर की स्थापना के साथ प्रदान किया गया एक उपकरण है।
हनी एल मौललेम

क्या 24 सैन्य पंक्तियों को एक नई तालिका में कॉपी करना संभव है, फिर बस दो को आवश्यकतानुसार बदल दें ताकि आप कभी भी 84 मिलियन पंक्तियों को अनावश्यक रूप से स्थानांतरित न करें?
लोवलीबा

क्या यह एक बंद या चालू प्रक्रिया है? मैं पूछता हूं क्योंकि, 80M पंक्तियों को संसाधित करने में लगने वाले समय को देखते हुए, यह संभावना है कि SOURCE उत्पादक पंक्तियों में डेटा परिवर्तन होगा जो अब DESTINATION में रहना चाहिए।
माइकल ग्रीन

यह एक XY समस्या की तरह दिखता है: आपको एक DB में सभी 84MM पंक्तियों के साथ समाप्त करने की आवश्यकता है, और एक दूसरे DB में 24MM की। क्या व्यावसायिक आवश्यकता की आवश्यकता है कि 84MM को स्थानांतरित किया जाए और 60M को हटा दिया जाए, बजाय केवल 24MM हिलाने के? लिंक: meta.stackexchange.com/questions/66377/what-is-the-xy-problem )
पीटर जेकरेन्स

मुझे एक समान समस्या है और यह स्पष्ट रूप से XY नहीं है। रिकॉर्ड प्रतिधारण से संबंधित कानूनों के प्रसार से पहले हमने सभी डेटा रखे। अब हमें उन तारीखों से पुरानी पंक्तियों को हटाना होगा जो हमें उन्हें रखने के लिए कानूनी रूप से आवश्यक हैं। इसका मतलब है कि डेटा के 20 साल से अधिक समय के लिए संग्रह करना और हटाना क्योंकि ज्यादातर मामलों में कानूनी प्रतिधारण 7 साल है। मुझे नहीं लगता कि विश्वास करने के लिए मैं अकेला हूँ Microsoft संग्रहीत प्रक्रियाओं के लिए 'बल्क कॉपी' कार्यक्षमता प्रदान करने में नहीं है। एक एप्लिकेशन को 'डीबी की तुलना में एक डीबी' के भीतर डेटा आंदोलन में तेज नहीं होना चाहिए। अगले साल एक और साल संग्रहीत किया जाना चाहिए।
बिलावस्की

जवाबों:


11

मैं इसे जोड़ना चाहूँगा, हालाँकि आप इस से संपर्क करने का निर्णय लेते हैं, आपको इन लेन-देन को बैचने की आवश्यकता होगी । मैं हाल ही में लिंक किए गए लेख के साथ बहुत अच्छी किस्मत पा चुका हूं, और मैं जिस तरह से सबसे अधिक बैचेड समाधानों का विरोध करता हूं, उनके अनुक्रमों का लाभ उठाने के तरीके की सराहना करता हूं।

यहां तक ​​कि न्यूनतम रूप से लॉग किया गया, वे बड़े लेनदेन हैं , और आप असामान्य लॉग ग्रोथ (वीएलएफ, ट्रंकटिंग, राइट-साइजिंग, आदि) के प्रभाव से निपटने में बहुत समय बिता सकते हैं।

धन्यवाद


3

"कुशल" लॉग फ़ाइल उपयोग, I / O प्रदर्शन, सीपीयू समय या निष्पादन समय पर लागू हो सकता है।

मैं एक न्यूनतम लॉग ऑपरेशन को प्राप्त करने की कोशिश करूंगा, जो लॉगिंग दृष्टिकोण से काफी कुशल होगा। यह आपको कुछ निष्पादन समयसीमाओं को एक बोनस से बचाना चाहिए। यदि आपके पास अस्थायी स्थान है, तो निम्न आपके लिए काम कर सकते हैं।

CREATE TABLE #temp;
ALTER source -> BULK_LOGGED recovery model

BEGIN TRANSACTION;

    INSERT INTO dest SELECT FROM source;
    INSERT INTO #temp SELECT FROM source WHERE keep_condition=1;
    TRUNCATE TABLE source;
    INSERT INTO source SELECT FROM #temp;

COMMIT TRANSACTION;

ALTER source -> FULL recovery model
DROP TABLE #temp;

न्यूनतम रूप से लॉग किए गए ऑपरेशन के लिए, कई शर्तों को पूरा करना पड़ता है, जिनमें वर्तमान में कोई बैकअप नहीं है, डेटाबेस BULK_LOGGEDपुनर्प्राप्ति मोड पर सेट है, और आपके अनुक्रमित के आधार पर, लक्ष्य तालिका खाली हो सकती है। SQL Server 2005 से 2008 तक इस व्यवहार में कुछ परिवर्तन (सुधार) भी हुए।

फिर, अपनी तालिका और डेटा की बारीकियों को जाने बिना, आपका कोई भी अन्य विकल्प बेहतर प्रदर्शन कर सकता है। प्रयोग करके देखें

SET STATISTICS IO ON;
SET STATISTICS TIME ON;

.. और देखें कि कौन सा सबसे अच्छा काम करता है।

संपादित करें : बल्क-लॉग्ड ऑपरेशन करते समय, सुनिश्चित करें कि आप ऑपरेशन से पहले और बाद में बैकअप (पूर्ण या लेन-देन लॉग) बनाते हैं, अगर आपको पॉइंट-इन-टाइम रिस्टोर क्षमता की आवश्यकता है और आपको संदेह है कि डेटाबेस में अन्य गतिविधि हो रही है उसी समय जब आपका ETL जॉब चल रहा हो।

मैंने कुछ समय पहले न्यूनतम रूप से लॉग किए गए कार्यों पर एक ब्लॉग पोस्ट लिखा था, इसमें अन्य पदों और प्रलेखन के लिंक हैं।


ओपी को सलाह देने के लिए परीक्षण करने के लिए देखें कि कौन बेहतर प्रदर्शन करता है। बेशक, यह वास्तविक संख्या प्राप्त करने के लिए थोड़ा मुश्किल हो सकता है जब तक कि उसके पास देव में एक डुप्लिकेट प्रणाली न हो, आदि
मैक्स वर्नोन

बस एक सवाल है, अगर आप डेटाबेस को बल्क लॉग इन मोड में रखते हैं, तो आप समय को बहाल करने की कोशिश करेंगे तो क्या होगा? मुझे लगता है कि "बल्क" के रूप में योग्य नहीं होने वाले किसी भी लेनदेन को पुनर्प्राप्त करने योग्य होगा।
--११२१२

1
@ elty123 बल्क लॉग रिकवरी में आप केवल अपने अंतिम लॉग बैकअप के अंत तक ही रिस्टोर कर सकते हैं। समय की रिकवरी का कोई मतलब नहीं है जैसे पूरी रिकवरी के साथ होगा। आम तौर पर आप बल्क लॉग रिकवरी पर स्विच करते हैं, कुछ ईटीएल प्रक्रिया चलाते हैं, पूर्ण पर वापस जाते हैं और फिर लॉग बैकअप लेते हैं।
रूबरचाइकल लाईडर

@IndRaven यह सही नहीं है - नीचे मेरा उत्तर देखें।
6

1
@wBob और @WindRaven, मैंने BULK_LOGGEDमोड का उपयोग करने से पहले और बाद में बैकअप लेने की आवश्यकता को प्रतिबिंबित करने के लिए अपना उत्तर अपडेट किया है। धन्यवाद!
डैनियल हटमाचर

1

BCP क्यों नहीं?

  1. बैक अप सीडबर्ड
  2. Sourcedb को बल्क-लॉग में बदलें
  3. ओपन कमांड प्रॉम्प्ट

  4. bcp server.sourcedb.table out Filename.flt -T -c

  5. bcp "SELECT * FROM sourcedb.table WHERE keep_condition = 1" queryout Filename2.flt -T -c

  6. bcp Server.destinationdb.table in Filename.flt -T -c -b1000

  7. डेटा की जाँच करें

  8. SSMS ट्रंककेट से सॉर्सेडब टेबल से
  9. bcp server.sourcedb.table in Filename2.flt -T -c -b1000
  10. खटास को वापस पूर्ण में बदलें

2
क्योंकि वे एक ही सर्वर पर हैं। फाइलसिस्टम को लिखना महंगा होगा। एक डेटाबेस बनाने और इसे बेहतर बनाने के लिए बेहतर है, उम्मीद है कि तत्काल फ़ाइल आरंभीकरण का लाभ उठाएं। यह विभिन्न सर्वरों पर dbs के लिए एक उचित विकल्प होगा, हालांकि उपलब्ध होने पर SSIS मेरी पहली पसंद होगी। NB: विकल्प -n (देशी) SQL सर्वर से SQL सर्वर पर डेटा ले जाने के लिए अधिक कॉम्पैक्ट और सुरक्षित है। ऑप्शन -b का bcp आउट के लिए कोई प्रभाव नहीं है।
डब्ल्यूएक्यू

0

मत सोचो कि आपको पहले या बाद में पूर्ण डेटाबेस बैकअप या टी-लॉग बैकअप के बिना पुनर्प्राप्ति मॉडल को बदलने की सिफारिश की जानी चाहिए । BULK_LOGGED रिकवरी मॉडल की एक विशेषता यह है कि आप बल्क-लॉग्ड ऑपरेशन वाले टी-लॉग के लिए पॉइंट-इन-टाइम रिकवरी करने की क्षमता खो देंगे। क्लासिक परिदृश्य: रात में पूर्ण बैकअप, प्रति घंटा टी-लॉग बैकअप। आप पुनर्प्राप्ति मॉडल को बल्क-लॉग में बदल देते हैं और अपना ऑपरेशन शुरू करते हैं। कुछ गलत हो जाता है और लेनदेन वापस हो जाता है (या आपने एक का उपयोग नहीं किया है)। हालाँकि आप सुनिश्चित नहीं हैं कि डेटाबेस में और क्या चल रहा था इसलिए आप एक ज्ञात अच्छे बिंदु पर पुनर्स्थापित करना चाहते हैं।

आप वापस कब पुनर्स्थापित कर सकते हैं? पिछले घंटे के टी-लॉग बैकअप जिसमें बल्क-लॉग्ड ऑपरेशंस शामिल नहीं हैं, संभावित रूप से लेनदेन के एन मिनट खो रहे हैं। पुनर्प्राप्ति मॉडल को बदलने से पहले एक पूर्ण बैकअप या टी-लॉग बैकअप एक फ़ॉलबैक बिंदु बनाएगा। आप जो चुनते हैं वह आपके आरटीओ पर निर्भर करता है।


0

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

हालांकि, विभाजन को सक्षम करने की लागत इसे और अधिक महंगा ऑपरेशन बना सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.