উত্পাদন থেকে পরীক্ষামূলক ডাটাবেসের মধ্যে কয়েকটি টেবিল রিফ্রেশ করার সর্বোত্তম পদ্ধতি কী?


12

এসকিউএল সার্ভার ২০০৮আর 2 এ আমার একটি খুব বড় উত্পাদন ডেটাবেস এবং একটি খুব বড় পরীক্ষার পরিবেশ ডাটাবেস রয়েছে। উভয় ডাটাবেসে একই সারণী কাঠামো রয়েছে তবে বিভিন্ন ব্যবহারকারী / লগইন / অনুমতি / ভূমিকা রয়েছে।

আমাকে মাসে প্রায় একবার উত্পাদন থেকে টেস্ট ডাটাবেসে কয়েকটি টেবিল রিফ্রেশ করতে হবে।

বর্তমান পদ্ধতিতে আমি এটি করার পরিকল্পনা করছি

  1. প্রোডাকশন থেকে আমার প্রয়োজনীয় টেবিলগুলির রফতানি নিতে BCP ইউটিলিটিটি ব্যবহার করুন।
  2. পরীক্ষার সার্ভারে বিসিপি এক্সপোর্ট ফাইলটি অনুলিপি করুন
  3. পরীক্ষায় আমি সতেজ করছি এমন সমস্ত সারণীতে সূচি এবং সীমাবদ্ধতা অক্ষম করুন
  4. পরীক্ষার ডাটাবেস টেবিলগুলি কেটে ফেলুন
  5. বিসিপি ব্যবহার করে ডেটা আবার টেস্ট ডাটাবেস সারণিতে লোড করুন।
  6. সূচী পুনর্নির্মাণ এবং পরীক্ষায় সীমাবদ্ধতাগুলি পুনরায় সক্ষম করুন

এত ছোট্ট কাজের জন্য এগুলি কিছুটা জটিলই বলে মনে হচ্ছে। দেখে মনে হচ্ছে এটি অনেকগুলি পুনরায় তৈরি করবে (টি-লগে) এটি করার আরও ভাল উপায় আছে কি?

আমি এটি করার আরেকটি উপায় হ'ল পরীক্ষার পরিবেশে প্রোডাকশন থেকে ব্যাকআপ পুনরুদ্ধার করা - তবে আমার কাছে সমস্যাটি হ'ল একটি সম্পূর্ণ ব্যাকআপ বেশ বড় হবে এবং আমার সারণী সতেজ হওয়ার দরকার নেই, কেবল কয়েকটি- -আর ব্যবহারকারীর এবং উত্পাদন ডাটাবেসের সুরক্ষাও পরীক্ষার চেয়ে আলাদা। আমি পুরো ডাটাবেসটি পুনরুদ্ধার করলে সেটি প্রোডাকশন ডাটাবেজে সুরক্ষা সেটিংস দ্বারা ওভাররাইট করা হবে।


এই পদ্ধতির তদন্তটি মূল্যবানও হতে পারে: sqlperformance.com/2012/08/t-sql-queries/… এবং sqlperformance.com/2013/04/t-sql-queries/…
অ্যারন

উত্তর:


4

আপনার প্রয়োজন অনুসারে 2 টি পদ্ধতি রয়েছে:

(দ্রষ্টব্য: টেবিল ফরেইন কী দ্বারা সমর্থিত হয়, তাহলে আপনি ব্যবহার করতে সক্ষম হবেন না TRUNCATE। আপনি আছে খন্ডে জন্য মোছার পরিবর্তে, আপনি সব ইনডেক্স + + পররাষ্ট্র কী ও লোড ডেটা ড্রপ করতে পারেন এবং তারপর সেগুলিকে পুনরায়।)।

  • বিসিপি আউট এবং বাল্ক ইনসার্ট ইন গন্তব্য ডেটাবেস

    • নিশ্চিত করুন যে আপনি পরীক্ষার ডাটাবেসটিকে সাধারণ / বাল্ক-লগ-রিকভারি মোডে রেখেছেন।
    • ট্রেস ফ্ল্যাগ 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: এসএসআইএস - এই ক্ষেত্রে আমার পছন্দসই পদ্ধতি।

    • ডিস্কে কোনও স্টেজিংয়ের প্রয়োজন নেই। সমস্ত প্রক্রিয়া স্মৃতিতে সম্পন্ন হয়।
    • আপনি পিআরডি থেকে টেস্ট সার্ভারে সারণীগুলির রিফ্রেশটি স্বয়ংক্রিয় করতে প্রতিমাসে এসকিএল এজেন্ট কাজের সাহায্যে এসএসআইএস প্যাকেজটি নির্ধারণ করতে পারেন।
    • " দ্রুত লোড " বিকল্পটি চয়ন করুন
    • নিশ্চিত হয়ে নিন যে আপনি প্রতি ব্যাচ সংখ্যায় একটি ভাল সারি বেছে নিচ্ছেন (যদি আপনি খুব বেশি চয়ন করেন তবে লকটি বাড়ানো হবে - এটি 5 কে এর চেয়ে কম রাখুন)

তথ্যসূত্র: ডেটা লোডিং পারফরম্যান্স গাইড এবং এর জন্য আমার উত্তর - টেবিলের মধ্যে সন্নিবেশ করুন সারণি বনাম বাল্ক সন্নিবেশ থেকে নির্বাচন করুন


1
এসএসআইএস অবশ্যই এখানে যাওয়ার উপায়। ডেটা পাম্পিং হ'ল যা করার জন্য ডিজাইন করা হয়েছিল।
স্টিভ মঙ্গিয়ামালী

3

ব্যাকআপ এবং পুনরুদ্ধার করার প্রয়োজন নেই, বা বাহ্যিক প্রক্রিয়াগুলি (যেমন বিসিপি) কল / সমন্বয় করা, বা এসএসআইএসের সাথে জগাখিচুড়ি করা (খুব শক্তিশালী, খুব দুর্দান্ত, তবে আমি যদি এড়াতে পারি তবে অবশ্যই করব :)। আপনি এস -কিউএল এজেন্টের মাধ্যমে নির্ধারিত কোনও স্টোরেজ পদ্ধতিতে, বা মাসে একবার চালানো কোনও স্ক্রিপ্ট (যদিও এটি প্রোক এবং সময় নির্ধারণের ক্ষেত্রে কম কাজ হয়) টি-এসকিউএল এর স্বাচ্ছন্দ্য থেকে আপনি সমস্ত কিছু পরিচালনা করতে পারেন though চালানো)। কিভাবে? এসইকিউএলসিআরআর ব্যবহার করে SqlBulkCopy। নেট এ ক্লাস অ্যাক্সেস করার জন্য এটি প্রয়োজনীয়ভাবে বিসিপি হ'ল বিসিপিকে কল করার মতো ঝামেলা ছাড়াই। আপনি নিজেরাই কোড করতে পারেন: এর মতো কোনও সুপার জটিল সেটআপ বা কিছুই নেইSqlBulkCopyক্লাসটি আপনার জন্য প্রায় সবকিছুর যত্ন নেয় (আপনি ব্যাচের আকার নির্ধারণ করতে পারেন, ট্রিগারগুলি ফায়ার করা উচিত কি না ইত্যাদি)। অথবা, যদি আপনি কোনও এসেম্বলিকে সংকলন এবং মোতায়েনের সাথে ঝামেলা করতে না চান তবে আপনি একটি প্রাক-বিল্ট এসকিউএলসিআরআর সঞ্চিত পদ্ধতি ব্যবহার করতে পারেন যেমন ডিবি_বুলকপি যা এসকিউএল # এসকিউএলসিআর লাইব্রেরির অংশ (যা আমি এর লেখক, তবে এটি সঞ্চিত পদ্ধতি ফ্রি সংস্করণে রয়েছে)। নিম্নলিখিত উত্তরে DB_BulkCopy ব্যবহারের উদাহরণ সহ আমি এটিকে আরও বিশদে বর্ণনা করি :

একটি ডাটাবেস থেকে অন্য স্ক্রিপ্টে ডেটা আমদানি করুন

আপনার বর্তমান পরিকল্পনায় এটি কোথায় রাখবেন তা যদি পরিষ্কার না হয় তবে আপনি নিম্নলিখিতগুলি করবেন:

  • পদক্ষেপ 1 এবং 2 সরান (ওহু!)
  • DB_BulkCopyEXEC এর একটির সাথে 5 বা পদক্ষেপটি প্রতিস্থাপন করুন বা আপনি নিজেরাই কোড করুন যদি আপনি এটি কল করেন, যা কেবলমাত্র পয়েন্ট এ থেকে পয়েন্ট বিতে ডেটা সরিয়ে নিয়েছে

এছাড়াও, এটি SqlBulkCopyএবং ডিবি_বুলকপিটিও উল্লেখ করা উচিত :

  • যে কোনও ফলাফল সেটকে গ্রহণ করতে পারে: এটি কোনও সঞ্চিত পদ্ধতির নির্বাচন বা এক্সইসি কিনা তা বিবেচনা করে না
  • এই টেবিলে যে কোনওটিতে স্কিমা পরিবর্তন করা হলে আপডেট করা খুব সহজ; আপনার সঞ্চিত পদ্ধতিতে ক্যোয়ারী পরিবর্তন করুন যা এই এসকিউএলসিআরআর সঞ্চিত পদ্ধতি বলে calls
  • ক্ষেত্রের পুনরায় তৈরি করার অনুমতি দিন, যদি এটির প্রয়োজন হয়

স্কেলবুল্ককপির মাধ্যমে ন্যূনতম লগড অপারেশন সম্পর্কিত আপডেট

নূন্যতম লগ করা অপারেশনগুলি পাওয়া সম্ভব তবে আপনার জানা উচিত:

  • আপনার টেবিললক বাল্ক কপি বিকল্পটি ব্যবহার করতে হবে
  • ক্লাস্টারড ইনডেক্সগুলির টেবিলগুলির জন্য এটি করা, প্রথমে ডেটা লোড করুন [tempdb]এবং তারপরে গন্তব্যটিতে আদেশযুক্ত সন্নিবেশ করুন। অতএব, শারীরিক I / O টেম্পডবি (ডেটা এবং লগ ফাইলগুলি) পাশাপাশি বাছাই করা ক্রিয়াকলাপ ( ORDER BYযার ফলে ন্যূনতম লগ করা অপারেশনগুলি পাওয়ার জন্য প্রয়োজনীয় ) উভয় ক্ষেত্রে অতিরিক্ত কিছু লোড ভারপ্রাপ্ত রয়েছে
  • কিছু পরীক্ষার ফলাফল এখানে: হোয়াইটপেপার: স্কেলবুলকপি এর পারফরম্যান্স
  • কিছু পরীক্ষার ফলাফল এখানে: স্কলবুলকপি ন্যূনতম লগিং না করে সমস্যা নিবারণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.