Test veritabanındaki yalnızca birkaç tabloyu üretimden yenilemenin en iyi yöntemi nedir?


12

SQL Server 2008R2'de çok büyük bir üretim veritabanına ve çok büyük bir test ortamı veritabanına sahibim. Her iki veritabanı da benzer tablo yapısına sahiptir, ancak farklı kullanıcılar / girişler / izinler / roller.

Test veritabanında sadece birkaç tabloyu periyodik olarak üretimden yaklaşık ayda bir kez yenilemem gerekiyor.

Bunu yapmayı planladığım şu an

  1. Üretimden ihtiyacım olan tabloları dışa aktarmak için BCP yardımcı programını kullanın.
  2. Bcp dışa aktarma dosyasını test sunucusuna kopyalayın
  3. Testte yenilediğim tüm tablolarda dizinleri ve kısıtlamaları devre dışı bırak
  4. Test veritabanı tablolarını kesme
  5. Verileri BCP kullanarak Test veritabanı tablolarına geri yükleyin.
  6. Testlerde dizinleri yeniden oluşturma ve kısıtlamaları yeniden etkinleştirme

Bütün bunlar böyle küçük bir görev için biraz fazla karmaşık görünüyor. Ayrıca (t-log'da) çok fazla yineleme üretecek gibi görünüyor Bunu yapmanın daha iyi bir yolu var mı?

Bunu yapmayı düşündüğüm bir başka yol, Üretim'den bir test ortamına yedeklemeyi geri yüklemektir - ancak sahip olduğum sorun, tam bir yedeklemenin oldukça büyük olacağı ve tüm tabloların yenilenmesi gerekmiyor, sadece birkaç tane- -ve ayrıca üretim veritabanındaki kullanıcılar ve güvenlik testten farklıdır. Tüm veritabanını geri yüklersem, üretim veritabanındaki güvenlik ayarları üzerine yazılır.


Yanıtlar:


4

İhtiyaçlarınıza uygun 2 yöntem vardır:

(Not: Tablolara yabancı anahtarla başvurulursa, bunu kullanamazsınız TRUNCATE. Parçalar halinde silmeniz gerekir . Alternatif olarak, tüm dizinleri + Yabancı anahtarları bırakabilir ve verileri yükleyebilir ve daha sonra yeniden oluşturabilirsiniz).

  • BCP OUT ve BULK hedef veritabanına ekleyin .

    • Test veritabanını basit / toplu günlüğe kaydetme kurtarma moduna geçirdiğinizden emin olun.
    • İzleme Bayrağı 610'u etkinleştir - dizinlenmiş tablolara minimal olarak eklenmiş ekler.

      /************************************************************************************************************************************************
      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)
      

-

  • Yöntem 2: SSIS - Bu durumda tercih ettiğim yöntem.

    • Diske hazırlık gerekmez. Tüm işlemler bellekte yapılır.
    • Tabloların yenilenmesini PROD'dan TEST sunucusuna otomatikleştirmek için her ay sql agent işini kullanarak SSIS paketini zamanlayabilirsiniz.
    • " HIZLI YÜK " seçeneğini seçin
    • Parti numarası başına iyi bir satır seçtiğinizden emin olun (Çok yüksek seçerseniz kilit yükselmesi olacaktır - 5K'dan düşük tutun)

Referans: Veri Yükleme Performansı Kılavuzu ve cevabım - Tabloya ekle seç * tablodan toplu ekleme


1
SSIS kesinlikle buraya gitmenin yolu. Veri pompalama bunu yapmak için tasarlanmıştır.
Steve Mangiameli

3

Yedekleme ve geri yükleme yapmaya, harici işlemleri (yani BCP) çağırmaya / koordine etmeye, hatta SSIS ile karışıklığa (çok güçlü, çok havalı, ancak bundan kaçınabilirsem, kesinlikle :) :) gerek yoktur. Tüm bunları, T-SQL'in konforundan, SQL Agent aracılığıyla programlayabileceğiniz saklı bir yordamda veya ayda bir kez çalıştırdığınız bir komut dosyasında (bir proc ve zamanlamaya sahip olmak uzun süre daha az iş olsa da) işleyebilirsiniz. Çalıştırmak). Nasıl? SQLCLR'yi kullanarak, BCP'yi SqlBulkCopyçağırmanın tüm karışıklıkları olmadan aslında BCP olduğu için .NET'te Class'a erişmek için . Bunu kendiniz kodlayabilirsiniz: süper karmaşık kurulum veyaSqlBulkCopysınıf sizin için hemen hemen her şeyi halleder (tetikleyicileri tetikleyip tetiklememek için parti boyutunu ayarlayabilirsiniz). Ya da, bir Derleme derleme ve dağıtma ile uğraşmak istemiyorsanız , SQL # SQLCLR kütüphanesinin bir parçası olan DB_BulkCopy gibi önceden oluşturulmuş bir SQLCLR saklı yordamını kullanabilirsiniz (yazarım, ancak bu saklanır yordamı Ücretsiz sürümündedir). Bu soruyu aşağıdaki yanıtta DB_BulkCopy kullanma örneği de dahil olmak üzere daha ayrıntılı olarak açıklarım :

Bir Veritabanından başka bir komut dosyasına veri aktarma

Bunu mevcut planınıza nereye yerleştireceğiniz açık değilse, aşağıdakileri yaparsınız:

  • Adım 1 ve 2'yi kaldırın (woo hoo!)
  • Bir ile adım 5 değiştirin EXECait DB_BulkCopy yoksa sadece Noktası B'ye A noktasından veri taşır, hangi kendiniz kod eğer ne diyorsanız

Ayrıca, belirtilmelidir SqlBulkCopyve DB_BulkCopy :

  • herhangi bir sonuç kümesini kabul edebilir: saklı yordamın SELECT veya EXEC olması fark etmez
  • bu tablolardan herhangi birinde şema değişiklikleri yapıldığında güncellenmesi çok kolaydır; saklı yordamınızdaki bu SQLCLR saklı yordamı çağıran sorguyu ALTER
  • gerekirse, alanların yeniden eşlenmesine izin ver

SqlBulkCopy ile Minimum Kayıtlı İşlemler Hakkında GÜNCELLEME

Minimal olarak kaydedilmiş işlemler elde etmek mümkündür, ancak şunları bilmelisiniz:

  • TableLock Toplu Kopyalama seçeneğini kullanmanız gerekir
  • Bunu yapmak, Kümelenmiş Dizinlere sahip tablolar için önce verileri yükler [tempdb]ve ardından sipariş edilen eki hedefe yapar. Bu nedenle, hem tempdb'ye fiziksel G / Ç (veri ve günlük dosyaları) hem de sıralama işlemi ( ORDER BYminimum düzeyde kaydedilmiş işlemleri almak için gerekli olandan dolayı) için bazı ek yükler vardır.
  • Bazı test sonuçları burada: Teknik inceleme: SqlBulkCopy performansı
  • Burada bazı test sonuçları: Sorun Giderme SqlBulkCopy en az günlük kaydı yapmıyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.