SQL Server 2012 yedeklemesini SQL Server 2008 veritabanına geri yükleme?


41

Bir SQL Server 2012 veritabanı yedeğini bir SQL Server 2008'e geri yüklemek için bir yolu var mı?

Dosya eklemeye çalıştım, çalışmıyor.


: Ödeme bu referanslar size yardımcı olacaktır msdn.microsoft.com/en-us/library/ms140052.aspx dba.stackexchange.com/questions/5511/... sayesinde

Buna eşit başka bir soru daha var ve çok iyi cevaplandı: superuser.com/questions/468578/…
Cavaleiro

1
Burada bu soruna harika bir çalışma yanıtı var (geçiş, yedekleme / geri yükleme değil): stackoverflow.com/questions/19837886/…
Don Jewett 19

Yanıtlar:


30

Birkaç seçeneğiniz var:

Seçenek A : Veritabanını komut dosyası oluştur seçeneğini kullanarak uyumluluk modunda kodlayın:

Not: Veritabanını şema ve verilerle kodlarsanız, veri boyutunuza bağlı olarak, komut dosyası büyük olacaktır ve SSMS, sqlcmd veya osql (aynı zamanda GB cinsinden olabilir) tarafından ele alınmayacaktır.

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

Seçenek B:

Önce tüm dizinleri, FK'ları, vb. İçeren tabloları kodlayın ve hedef veritabanında boş tablolar oluşturun - seçenek SADECE SCHEMA ile (Veri yok).

Veri eklemek için BCP kullanın

  1. Aşağıdaki betiği kullanarak veri bcp. SSMS'yi Metin Modu'na ayarlayın ve aşağıdaki komut dosyası tarafından üretilen çıktıyı bir yarasa dosyasına kopyalayın.

    -- 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\*.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\'  /* 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) <> 'unwantedschema'    */                             /* Optional to exclude any schema  */
    order by schema_name(schema_id)
    
  2. Belirttiğiniz klasördeki .dat dosyalarını oluşturacak yarasa dosyasını çalıştırın.

  3. Hedef sunucuda aşağıdaki betiği SSMS ile tekrar metin modunda çalıştırın.

    --- 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 = 'destinationDB' /* 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\' /* 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) <> 'unwantedschema' /* Optional to exclude any schema */
        order by schema_name(schema_id) 
    
  4. Tablolara veri eklemek için SSMS'yi kullanarak çıkışı çalıştırın.

Bu, Native modunu kullandığı için çok hızlı bcp metodudur.


Çok yararlı - B yöntemi benim için çalıştı (A yönteminin ürettiği SQL 7GB idi ve SSMS'nin hiçbiri yoktu). Bazı SSID'ler ve bağlantılı sunucular düzgün bir şekilde karşılaşmadı, ancak bağlantılı sunucularla ne zaman bir ilgisi oldu? Bunu üretimde kullanmaktan mutlu olacağımdan emin değilim, ancak% 95 oranında hızlı bir test ortamı elde etmek için mükemmeldi.
aucuparia

@ aucuparia Some SSIDs and linked servers didn't go across properly. Bağlantılı sunucular manuel olarak yazılmalıdır. SSID'ler, sp_helprevlogin kullanılarak trnasfered edilebilir. SQLAgent işleri, ssis paketleri vb ihtiyaçlarınız doğrultusunda taşınmalıdır. Bu yöntemin amacı, 2 veritabanını küçültürken veya birleştirirken verileri olabildiğince hızlı elde etmektir.
Kin Shah,

B seçeneği benim için çalışan tek yöntemdi, çünkü üretilen komut dosyaları diğer yönlerden çok büyüktü
JumpingJezza

23

Hayır, geriye doğru gidemezsiniz, sadece ileriye. 2008'de boş bir veritabanı oluşturabilir ve daha sonra şema ve verileri (veya Red Gate ve diğerlerinden 3. taraf karşılaştırma araçlarını) kodlamak için Management Studio'daki Komut Dosyaları Oluştur sihirbazını kullanabilirsiniz. Doğru hedef versiyonunu 2008 olarak belirlediğinizden emin olun;


8

Bunu yapmanın desteklenen bir yolu yoktur, çünkü SQL Server bu tür bir uyumluluğa izin vermez.

Ne yapabilirsin

  1. SQL 2012'de veritabanını geri yükle

  2. Nesneler ve veriler için komut dosyaları oluşturmak

  3. SQL 2012 için benzersiz olan tüm ayrıntılardan komut dosyalarını temizleme
  4. 2008'de komut dosyalarını çalıştırmak

SQL Server 2012'ye sahip değilseniz, yedek okumak ve veri ve yapı çıkarmak için üçüncü taraf araçlarını kullanabilirsiniz.

Bu durumda sadece SQL 2008'de boş bir veritabanı oluşturun ve nesneleri ve verileri senkronize etmek için ApexSQL Diff ve ApexSQL Data Diff gibi araçları kullanın . Bunları Red Gate veya Idera gibi diğer büyük satıcılardan da bulabilirsiniz.

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.