Veritabanını SQL Server 2012'den SQL Server 2005'e taşıma


30

Bir veritabanını SQL Server 2012'den (32bit) SQL Server 2005'e (64bit) taşımam gerekirse seçeneklerim nelerdir?

Yapamayacağımı biliyorum:

  • SQL Server 2005'te veritabanının yedeğini geri yükleyin
  • ayır ve ekle

Yapabileceğimi biliyorum:

  • içe aktarma sihirbazını kullanın ve bunu tek bir veritabanında denedim, ancak yalnızca verileri taşıdı ve hatta kimlik sütunlarını korumak, tüm FK'leri, dizinleri yeniden oluşturmak için geçici tablolar oluşturmak için çok fazla çalışma yapmanız gerektiğinden zahmetli oldu.

Daha kolay bir seçenek var mı?


12
En kolay seçenek, hedefi 2012'ye yükseltmek, dürüst olmak gerekirse.
Aaron Bertrand

Yanıtlar:


40

Aşağıdaki herhangi bir yöntemi takip edebilirsiniz:

Not: Yeni veri türleri, vb. Gibi yeni özellikler kullanıyorsanız, hata atılacağı için denemeniz gerekir.

YÖNTEM 1: Yerel Araçları Kullanma

  1. SCHEMA_ONLY veritabanını yazıp hedef sunucuda boş bir veritabanı yeniden oluşturun. Aşağıda ekran görüntüleri:

    görüntü tanımını buraya girin

    görüntü tanımını buraya girin

    görüntü tanımını buraya girin

  2. Veri eklemek için BCP ÇIKIŞI ve TOPLU KONTROL kullanın.

Kısım 2'de size yardımcı olacak senaryo aşağıdadır.

/************************************************************************************************************************************************
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: Üçüncü taraf araçlarını kullanma

Hedef sunucuda boş bir veritabanı oluşturun. Hedef sunucuya veri oluşturmak ve yüklemek için Redgate'in şema karşılaştırmasını ve veri karşılaştırmasını kullanın.

Not: Redgate'in şeması ve verileri karşılaştırmasını kullandım ve bu tür görevler için en iyi araçlardır ve bu nedenle 3. taraf araçlarını kullanıyorsanız önerim Redgate olacaktır.


7
+1 ancak hedefte işe yaramayacak belli şeyler olduğunu aklınızda bulundurun (ve 3. parti araçların bunların hepsini nasıl idare edeceğinden emin değilim). DİZİ gibi nesneler, OFSET / FETCH, LAG / LEAD, vb. Gibi kodlar
Aaron Bertrand

1
Bu komut dosyalarını eski veritabanına karşı komut dosyası çalıştırıp çalıştırarak oluşturduğunuz şemaya sahip olduğunuzda, verileri aktarmak için başka bir seçenek, bağlı bir sunucu kurarak doğrudan bir örnekten diğerine kopyalamaktır. Tüm işi yapan bir döngü oluşturmak zor olmamalı. FK kısıtlamaları ile başa çıkmak için, tabloları uygun bir sırada kopyaladığınızdan emin olmanız gerekir veya FK'leri geçici olarak kaldırabilir ve kopyadan sonra yeniden etkinleştirebilirsiniz. Benzer şekilde, kopyalama sırasında hedefteki tetikleyicileri devre dışı bırakmak isteyeceksiniz.
David Spillett

4

Burada önerilen yöntemlere ek olarak, bir BACPAC dosyası oluşturmayı ve hedefinize içe aktarmayı da deneyebilirsiniz. Bu, Microsoft'un veritabanlarınızı kurum içi ortamdan Azure bulut veritabanlarına geçirilmesini nasıl önerdiğine benzer.

Bunun yararı, verinin yanı sıra veri şemasını da dışa aktarmanın bir kombinasyonudur ve veritabanı sürümüne bağlı olmadığından, veritabanlarını teorik olarak herhangi bir sürümden herhangi bir sürüme içe aktarabilirsiniz.

Bunun dezavantajı, kaynağında BACPAC dosyasını oluşturmadan önce, veritabanınızın dışındaki nesnelere referanslar varsa (kullanıcı veya sistem veritabanları olabilir) ya da varsa, kolayca başarısız olabilecek bir tür katı doğrulama işlemi gerçekleştirmesidir. şifreli nesneler. Fakat eğer şanslıysanız ve başarısız olmazsa, oldukça kolay bir çözüm olabilir.

İhtiyacınız olan tek şey daha yeni SSMS versiyonlarından (17 veya 18): https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

BACPAC dosyası oluşturmaya başlamak için, bir veritabanına sağ tıklayın ve "Veri Katmanı Uygulamasını Dışa Aktar ..." ı seçin (farklı bir şey olan "Veri Katmanı Uygulamasını Ayıkla ..." ile karıştırılmadığından emin olun):

Veri Katmanı Uygulamasını Dışa Aktar ...

Adımlar boyunca size rehberlik edecek basit bir sihirbaz sunulur. İşiniz bittiğinde, hedef veritabanınızda "Veritabanları" düğümünü sağ tıklatarak görebileceğiniz "Veri Katmanı Uygulamasını İçe Aktar ..." seçeneğini kullanabilirsiniz (yine, "Veri Dağıt" ile karıştırmayın). -Ter Uygulama ... "):

Veri Katmanı Uygulamasını İçe Aktar ...

Bu da size adım adım yol gösterecek basit bir sihirbaz gösterecektir.


-1

Sql Server sürümünü azaltmak çok zor bir iştir.
Gibi azaltmak için bazı seçenekler vardır;
Her şeyden önce, tüm veritabanı nesnesi komut dosyasını oluşturun ve hedef sunucuda çalıştırın.
Bundan sonra kullanabilirsiniz;

  • SSIS,
  • Veri Aracını İçe Aktar,
  • RedGate veya diğer gibi üçüncü taraf bir araç.

Ancak RedGate Veri Karşılaştırma aracı için,

yalnızca birincil anahtarları olan tabloları karşılaştırdığını düşünmelisiniz. Öyleyse, birincil anahtar olmayan tablolarınız başka yollardan kullanmalısınız.


8
Bu cevabın Kins cevabını geliştirdiğini sanmıyorum
James Anderson

-3

SQL Server'da bir veritabanını düşürmek mümkün değildir. Bununla birlikte, geçici bir çözüm, tüm DB nesnelerinin komut dosyasını yazmak ve komut dosyasını hedef veritabanına uygulamaktır. SSIS, bunun gerçekleştirilmesine yardımcı olmak için harika bir yoldur.


4
Sence bu Kin'in cevabına önemli bir şey ekler mi?
dezso
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.