उत्पादन से परीक्षण डेटाबेस के भीतर केवल कुछ तालिकाओं को ताज़ा करने के लिए सबसे अच्छी विधि क्या है?


12

मेरे पास SQL ​​Server 2008R2 में एक बहुत बड़ा उत्पादन डेटाबेस और एक बहुत बड़ा परीक्षण वातावरण डेटाबेस है। दोनों डेटाबेस में समान संरचना है लेकिन विभिन्न उपयोगकर्ता / लॉगिन / अनुमति / भूमिका।

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

वर्तमान तरीका मैं ऐसा करने की योजना बना रहा हूं

  1. उत्पादन से मुझे जिन तालिकाओं की आवश्यकता है, उनका निर्यात करने के लिए BCP उपयोगिता का उपयोग करें।
  2. परीक्षण सर्वर पर bcp निर्यात फ़ाइल की प्रतिलिपि बनाएँ
  3. सभी तालिकाओं पर अनुक्रमणिका और बाधाओं को अक्षम करें मैं टेस्ट में ताज़ा हूं
  4. टेस्‍ट डेटाबेस टेबलों को काटें
  5. BCP का उपयोग करके डेटा को वापस परीक्षण डेटाबेस तालिकाओं में लोड करें।
  6. अनुक्रमणिका का पुनर्निर्माण करें और परीक्षण में बाधाओं को फिर से सक्षम करें

यह सब इतने छोटे से काम के लिए बहुत जटिल लगता है। ऐसा भी लगता है कि यह बहुत अधिक रीडो उत्पन्न करेगा (टी-लॉग में) क्या ऐसा करने का एक बेहतर तरीका है?

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


यह दृष्टिकोण जांच के लायक भी हो सकता है: sqlperformance.com/2012/08/t-sql-queries/… और sqlperformance.com/2013/04/t-sql-queries/…
आरोन बर्ट्रेंड

जवाबों:


4

2 तरीके हैं जो आपकी आवश्यकताओं के अनुरूप होंगे:

(नोट: यदि तालिकाओं को विदेशी कुंजी द्वारा संदर्भित किया जाता है, तो आप उपयोग नहीं कर पाएंगे TRUNCATE। आपको विखंडू में हटाना होगा । वैकल्पिक रूप से, आप सभी अनुक्रमित + विदेशी कुंजियों को छोड़ सकते हैं और डेटा लोड कर सकते हैं और फिर उन्हें पुनः बना सकते हैं)।

  • BCP OUT और BULK INSERT इन्टो डेस्टिनेशन डेटाबेस

    • सुनिश्चित करें कि आपने परीक्षण डेटाबेस को सरल / बल्क-लॉग-रिकवरी मोड में रखा है।
    • Trace Flag 610 को सक्षम करें - अनुक्रमित तालिकाओं में न्यूनतम लॉग इन आवेषण।

      /************************************************************************************************************************************************
      Author      :   KIN SHAH    *********************************************************************************************************************
      Purpose     :   Move data from one server to another*********************************************************************************************
      DATE        :   05-28-2013  *********************************************************************************************************************
      Version     :   1.0.0   *************************************************************************************************************************
      RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
      *************************************************************************************************************************************************/
      
      -- save below output in a bat file by executing below in SSMS in TEXT mode
      -- clean up: create a bat file with this command --> del D:\BCP_OUT\*.dat 
      
      select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" '-- path to BCP.exe
              +  QUOTENAME(DB_NAME())+ '.'                                    -- Current Database
              +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
              +  QUOTENAME(name)  
              +  ' out D:\BCP_OUT\'                                           -- Path where BCP out files will be stored
              +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
              +  REPLACE(name,' ','') 
              + '.dat -T -E -SSERVERNAME\INSTANCE -n'                         -- ServerName, -E will take care of Identity, -n is for Native Format
      from sys.tables
      where is_ms_shipped = 0 and name <> 'sysdiagrams'                       -- sysdiagrams is classified my MS as UserTable and we dont want it
      and schema_name(schema_id) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
      order by schema_name(schema_id)                         
      
      
      
      --- Execute this on the destination server.database from SSMS.
      --- Make sure the change the @Destdbname and the bcp out path as per your environment.
      
      declare @Destdbname sysname
      set @Destdbname = 'destination_database_Name'               -- Destination Database Name where you want to Bulk Insert in
      select 'BULK INSERT '                                       -- Remember Tables **must** be present on destination Database
              +  QUOTENAME(@Destdbname)+ '.'
              +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.' 
              +  QUOTENAME(name) 
              + ' from ''D:\BCP_OUT\'                             -- Change here for bcp out path
              +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
              +  REPLACE(name,' ','') 
              +'.dat'' 
              with (
              KEEPIDENTITY,
              DATAFILETYPE = ''native'',  
              TABLOCK
              )'  + char(10) 
              + 'print ''Bulk insert for '+REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'+  REPLACE(name,' ','')+' is done... '''+ char(10)+'go' 
      from sys.tables
      where is_ms_shipped = 0 and name <> 'sysdiagrams'           -- sysdiagrams is classified my MS as UserTable and we dont want it
      and schema_name(schema_id) <> 'some_schema_exclude'         -- Optional to exclude any schema 
      order by schema_name(schema_id)

-

  • विधि 2: SSIS - इस मामले में मेरा पसंदीदा तरीका।

    • डिस्क के लिए कोई मंचन आवश्यक नहीं है। सभी प्रसंस्करण स्मृति में किया जाता है।
    • आप PROD से TEST सर्वर पर टेबल्स की रिफ्रेशमेंट को स्वचालित करने के लिए हर महीने sql Agent जॉब का उपयोग करके SSIS पैकेज को शेड्यूल कर सकते हैं।
    • " फास्ट लोड " विकल्प चुनें
    • सुनिश्चित करें कि आप प्रति बैच संख्या में एक अच्छी पंक्तियों का चयन करते हैं (यदि आप बहुत अधिक चुनते हैं, तो लॉक एस्केलेशन होगा - इसे 5K से कम रखें)

संदर्भ: डेटा लोड हो रहा है प्रदर्शन गाइड और के लिए मेरा जवाब - तालिका बनाम थोक सम्मिलित करें से तालिका चयन * में डालें


1
एसएसआईएस निश्चित रूप से यहां जाने का रास्ता है। डेटा पंपिंग वह है जिसे करने के लिए डिज़ाइन किया गया था।
स्टीव मैंगमेली

3

बैकअप और पुनर्स्थापना करने की आवश्यकता नहीं है, या बाहरी प्रक्रियाओं (यानी बीसीपी) को कॉल / समन्वयित करना है, या एसएसआईएस के साथ गड़बड़ भी है (बहुत शक्तिशाली, बहुत अच्छा, लेकिन अगर मैं इससे बच सकता हूं, तो मैं निश्चित रूप से :)। आप टी-एसक्यूएल के आराम से, एक संग्रहीत प्रक्रिया में, जिसे आप एसक्यूएल एजेंट, या एक स्क्रिप्ट के माध्यम से शेड्यूल कर सकते हैं, जो कि आप महीने में एक बार चलाते हैं (हालांकि एक खरीद और शेड्यूलिंग में होने के बावजूद) यह लंबे समय में कम काम है। Daud)। कैसे? SqlBulkCopy.NET में वर्ग तक पहुँचने के लिए SQLCLR का उपयोग करके क्योंकि यह आवश्यक रूप से BCP के सभी उपद्रव के बिना BCP है। आप इसे स्वयं कोड कर सकते हैं: कोई सुपर जटिल सेटअप या कुछ भी नहीं हैSqlBulkCopyक्लास आपके लिए लगभग हर चीज का ख्याल रखती है (आप बैच साइज सेट कर सकते हैं, ट्रिगर्स को फायर करना है या नहीं, आदि)। या, यदि आप करते संकलन और एक सभा की तैनाती के साथ गड़बड़ करने के लिए नहीं चाहते, तो आप इस तरह के रूप पहले से बने SQLCLR संग्रहीत प्रक्रिया का उपयोग कर सकते DB_BulkCopy जो का हिस्सा है एसक्यूएल # निम्नलिखित उत्तर में :SQLCLR लाइब्रेरी (जो मैं लेखक हूं, लेकिन यह संग्रहीत कार्यविधि नि: शुल्क संस्करण में है)। मैं इसे अधिक विस्तार से वर्णन करता हूं, जिसमें DB_BulkCopy का उपयोग करने का एक उदाहरण शामिल है

एक डेटाबेस से दूसरी स्क्रिप्ट में डेटा आयात करें

यदि यह स्पष्ट नहीं है कि इसे अपनी वर्तमान योजना में कहां रखा जाए, तो आप निम्नलिखित कार्य करेंगे:

  • चरण 1 और 2 निकालें (हू हू!)
  • चरण 5 EXECको DB_BulkCopy के साथ बदलें या जो भी आप इसे कॉल करें यदि आप इसे स्वयं कोड करते हैं, जो बस बिंदु A से बिंदु B तक डेटा ले जाता है।

इसके अलावा, यह बताया जाना चाहिए कि SqlBulkCopyऔर DB_BulkCopy :

  • किसी भी परिणाम सेट को स्वीकार कर सकते हैं: कोई फर्क नहीं पड़ता कि यह एक संग्रहीत प्रक्रिया का चयन या EXEC है
  • जब स्कीमा परिवर्तन इनमें से किसी भी तालिका में किया जाता है तो अपडेट करना बहुत आसान है; अपने संग्रहीत कार्यविधि में क्वेरी को केवल इस SQLCLR संग्रहीत कार्यविधि को कॉल करें
  • यदि आवश्यक हो तो खेतों को फिर से भरने के लिए अनुमति दें

UPDATE मिनिमली के बारे में SqlBulkCopy के माध्यम से लॉग इन संचालन के बारे में

न्यूनतम रूप से लॉग किए गए संचालन प्राप्त करना संभव है, लेकिन आपको पता होना चाहिए:

  • आपको TableLock Bulk Copy विकल्प का उपयोग करने की आवश्यकता है
  • ऐसा करना, क्लस्टर किए गए इंडेक्स वाली तालिकाओं के लिए, पहले डेटा को लोड [tempdb]करना और फिर गंतव्य में आदेशित सम्मिलित करना। इसलिए, कुछ अतिरिक्त भार है, दोनों को शारीरिक I / O के संदर्भ में tempdb (डेटा और लॉग फाइल) के साथ-साथ सॉर्ट ऑपरेशन (कारण के अनुसार)ORDER BY जिसके न्यूनतम रूप से लॉग किए गए संचालन प्राप्त करने के लिए आवश्यक है)
  • यहाँ कुछ परीक्षण के परिणाम: व्हाइटपेपर: SqlBulkCopy का प्रदर्शन
  • कुछ परीक्षण परिणाम यहाँ हैं: समस्या निवारण SqlBulkCopy न्यूनतम लॉगिंग नहीं कर रहा है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.