SQL Server veritabanı yedekleme geri yüklemesi alt sürümde


185

Daha yüksek bir sürüm SQL Server veritabanı yedekleme dosyasını daha düşük bir sürüm SQL Server'a nasıl geri yükleyebilirim?

SQL Server 2008 R2'yi (10.50.1600) kullanarak bir yedekleme dosyası oluşturdum ve şimdi sunucumun SQL Server 2008'inde (10.00.1600) geri yüklemek istiyorum .

SQL Server 2008 üzerine yedeklemeyi geri yüklemeye çalıştığımda bir hata veriyor Restore Failedçünkü:

Veritabanı, 10.50.1600 sürümünü çalıştıran bir sunucuda yedeklendi. Bu sürüm, 10.00.1600 sürümünü çalıştıran bu sunucu ile uyumsuz.

Bu sunucudaki yedekleme dosyasını nasıl geri yüklerim?


2
Bunu yapamazsınız - bu mümkün değil. SQL Server, bir veritabanının daha yüksek bir sürümden daha düşük bir sürüme düşürülmesine izin vermez
marc_s

18
Microsoft, SQL sunucusu hakkında her şeyi bilir (oluşturduklarından beri) ve yine de 2 sürüm arasında veri taşımak imkansızdır. Dışa aktarımda neden bir çeşit uyumluluk modunun bulunmadığını anlamıyorum. Ne kadar zor olabilir?
dvdmn

1
@dvdmn herhangi bir Top Gear bölümü kadar sert diyorlar - farklı türler, farklı ifadeler, farklı blok düzenleri. Veritabanları arasında veri taşımak , sürümler ne olursa olsun çok kolaydır. Gerçi düşürmek değil .
Panagiotis Kanavos

2
@PanagiotisKanavos Kabul etmiyorum, mysql'de db'yi sql komutları olarak dışa aktarabilir ve mysql'in herhangi bir sürümünde (aşağı veya yukarı) geri yükleyebilirsiniz. Evet, sql db'yi komut dosyası olarak da dışa aktarabilirsiniz, ancak birbirine bağlı bazı saklı işlev / yordamlarınız varsa geri yüklemek kolay değildir. Temel olarak yararlı / çözüm değildir.
dvdmn

3
@dvdmn bir veritabanının komut dosyalarını dışa aktarmak , yedeklemeden tamamen farklıdır. Bazı ürünlerin yedekleme / geri yükleme işlevi sunmadığını veya daha da kötüsü, iki kavramı karıştırdığını biliyorum. Bu genellikle tarihsel nedenlerden dolayı olur: geçmişte yedeklemenin olmaması, bu adla dışa aktarma / komut dosyası oluşturma adı verilen bazı ürünler. Şimdi onlar bunu , fiziksel ve mantıksal yedekleme hakkında konuşarak, terim çatışmaları çözme tutmak zorunda onlar komut dosyası bahsederken, o işe karışmak
Panagiotis Kanavos

Yanıtlar:


78

Hayır, bir veritabanını eski sürüme geçirmek mümkün değildir. 10.50.1600, SQL Server 2008 R2 sürümüdür. Bu veritabanını geri yüklemeye veya geri yüklemeye çalıştığınız SQL Server 2008 örneğine eklemenin hiçbir yolu yoktur (10.00.1600, SQL Server 2008'dir). Tek seçenekleriniz:

  • bu örneği SQL Server 2008 R2'ye yükseltin veya
  • SQL Server 2008 R2 örneğinde bulunan yedeklemeyi geri yükleyin, tüm verileri dışa aktarın ve bir SQL Server 2008 veritabanına alın.

i izin kısıtlamaları nedeniyle istemcilerin canlı sunucu yükseltme olamaz. ve benim veritabanı boyutu 2.5GB üzerinde bu yüzden bellek istisna hatası nedeniyle veri komut dosyası oluşturamadı.

9
@Gaurav Verileri komut dosyası olarak yazma - bunun yerine tüm veritabanını (tablolar, procs, tetikleyiciler, kısıtlamalar vb.) Veri olmadan komut dosyası oluşturun, yeni veritabanını oluşturun, ardından kaynak veritabanına sağ tıklayın, "Araçlar" a gidin, ardından "Araçlar" a gidin, Tabloların içeriğini veritabanınıza aktarmak için "Verileri Dışa Aktar".
Jim McLeod

17
"Olası bir yol yok" cevabının yanıtından çok şüpheliyim - bu, henüz yolu bulamadığınız anlamına gelir. Bunu yapmak istemenizin birçok nedeni olabilir, bu yüzden bu yararlı bir cevap değildir.
Jay Imerman

6
Katılıyorum, @Jay, bazen "yapamazsınız" mükemmel bir cevaptır, ancak mevcut olan yerlerde geçici çözümler sunmak daha yararlıdır.
Russell Fox

1
@ Sorularınız varsa, yorum olarak değil soru olarak sorun.
Remus Rusanu

83

Veritabanı şemasını ve verilerini içeren dosya üreten Verileri Katman Uygulamasını Dışa Aktar adlı işlevselliği kullanabilirsiniz .bacpac.

Hedef sunucuda, önceden oluşturulmuş dosyadan yeni veritabanı oluşturan ve dolduran Veri Katmanı Uygulamasını İçe Aktar seçeneğini kullanabilirsiniz.bacpac

Yalnızca veritabanı şemasını aktarmak istiyorsanız, dosya oluşturmak için Veri Katmanı Uygulamasını Çıkar ve oluşturulan veritabanı şemasını dağıtmak için Veri Katmanı Uygulamasını Dağıt'ı kullanabilirsiniz.

Bu işlemi SQL Server'ın SQL 2014'ten SQL 2012'ye ve SQL 2014'ten SQL 2008R2'ye farklı SQL Server sürümlerinde denedim ve iyi çalıştım.


8
Bu daha fazla ilgiyi hak eden bir cevaptır. Aslında çoğu durumda Just Work yapar. Yine de orada yetim kalmış SQL kullanıcılarınız varsa, Verme işlemleri başarısız olur. SQL sürümlerini aşmak için bu bitleri her zaman manuel olarak kaldırabilir / ekleyebilirsiniz.
Doktor Blue

3
Ben sadece MSSQLEX2012 (V11) üzerinde MSSQLEX2014 (V12) üzerinde oluşturulan bir DB oluşturmak için bunu denedim. Sadece değiştirmek için hiçbir yolu ile "Microsoft.Data.Tools.Schema.Sql.Sql120DatabaseSchemaProvider geçerli değil" hatası alıyorum.
Craig

5
Bir .bakpac kullanarak SQL Server 2014'ten 2012'ye alma işe yarar, ancak doğru SSMS sürümünü gerektirir. Örneğin, SSMS 2016 CTP3 kullanıyorum ve kusursuz çalıştı. SSMS 2012 kullanarak benim için çalışmadı. SSMS 2014'ü test etmedim.
Greg Gum

1
Herkes bir T-SQL bu yordamı komut dosyası olup olmadığını biliyor mu? GÜNCELLEME (biraz googling yaptıktan sonra kendime cevap veriyorum): bunu sqlpackage.exekomut satırı üzerinden otomatikleştirebilirsiniz . Daha fazlası için Google.
Alex

1
Bu oldukça büyük / karmaşık SQL2017'yi SQL2016'ya düşürmek için benim için çalışan tek çözüm. Performans da çok iyi.
Keith

35

İlle de çalışmayacak

Çalışacak

  • Komut dosyası oluşturma - Görevler -> Komut Dosyaları Oluştur . Komut Dosyası Seçeneklerini Ayarla -> Gelişmiş sayfasında istenen hedef SQL Server sürümünü ayarladığınızdan emin olun . Ayrıca şemayı, verileri veya her ikisini birden kopyalamayı da seçebilirsiniz. Oluşturulan komut dosyasında, ekspres olmayan ifadeden eksprese veya tersi yönde hareket ediyorsanız, mdf / ldf dosyalarının DATA klasörünü değiştirmeniz gerekebilir.

  • Microsoft SQL Server Veritabanı Yayımlama Hizmetleri - Sanırım SQL Server 2005 ve üstü ile birlikte geliyor. En son sürümü buradan indirin . Önkoşullar: sqlncli.msi/ sqlncli_x64.msi/ sqlncli_ia64.msi, SQLServer2005_XMO.msi/ SQLServer2005_XMO_x64.msi/ SQLServer2005_XMO_ia64.msi( buradan indirebilirsiniz ).


7
Komut dosyası oluşturma, önemli veritabanları için güvenilir değildir, mümkünse kaçının.
Chris

Alttaki her iki bağlantı da
404'tür

29

İşte bunu tamamlamak için farklı seçenekler üzerinde 2 sent:

Üçüncü taraf araçları : Muhtemelen işi yapmanın en kolay yolu, alt sürümde boş bir veritabanı oluşturmak ve daha sonra yedeklemeyi okumak ve yeni oluşturulan veritabanını yedeklemeyle senkronize etmek için üçüncü taraf araçlarını kullanmaktır.

Kırmızı kapı en popüler biridir ama ApexSQL Diff , ApexSQL Veri Diff , Adept SQL , Idera … gibi diğerleri vardır . Bunların hepsi premium araçlardır, ancak işi deneme modunda yapabilirsiniz;)

Komut dosyaları oluşturma : Diğerlerinin de belirttiği gibi, her zaman SSMS kullanarak yapı ve verileri komut dosyası oluşturabilirsiniz, ancak yürütme sırasını dikkate almanız gerekir. Varsayılan olarak, nesne komut dosyaları doğru sıralanmaz ve bağımlılıklarla ilgilenmeniz gerekir. Veritabanı büyükse ve çok fazla nesneye sahipse bu bir sorun olabilir.

Alma ve verme sihirbazı : Bu, tüm nesneleri değil yalnızca veri tablolarını geri yükleyeceği için ideal bir çözüm değildir, ancak gerektiğinde hızlı ve kirli düzeltmeler için düşünebilirsiniz.


1
Red Gate Sql Clone, SQL sunucusunun farklı sürümü arasında klonlamayı desteklemez ve bunu manuel olarak yapmaya çalışırken aldığım aynı hatayı bildirir.
DarkDeny

29

Üst sürümde oluşturulan veritabanını (veya eklemeyi) alt sürüme geri yükleyemezsiniz. Tek yol, tüm nesneler için bir komut dosyası oluşturmak ve komut dosyasını veritabanı oluşturmak için kullanmaktır.

resim açıklamasını buraya girin

seçmek "Şema ve Veriler" - Eğer Yedekleme komut dosyasına hem şeyleri alın isterseniz
seçin Sadece Şeması - sadece şema gerekiyorsa.

resim açıklamasını buraya girin

Evet, şimdi Veritabanı Şeması ve Verileri ile Komut Dosyası Oluştur ile işiniz bitti.


16

Bunu yapmanın başka bir yolu da "Veritabanını Kopyala" özelliğini kullanmaktır:

Kaynak veritabanını> "Görevler"> "Veritabanını Kopyala" yı sağ tıklayarak bulun.

Veritabanını SQL Server Örneği'nin daha düşük bir sürümüne kopyalayabilirsiniz. Bu benim için çalıştı bir SQL Server 2008 R2 (SP1) - 10.50.2789.0 Microsoft SQL Server 2008 (SP2) - 10.0.3798.0


3
Hedef, SQL Server "Hedef sunucu bir SQL Server 2005 veya üstü Express örneği olamaz." İfadesi olduğunda bunun çalışmadığını unutmayın. social.msdn.microsoft.com/Forums/tr-TR/sqlgetstarted/thread/…
Ohad Schneider

2
SQL Server 2012'den SQL Server 2008'e bu şekilde bir veritabanı kopyalamak da mümkün değildir.
Twinkles

1
Kopya veritabanı olan bir Ayır / operasyonu takın
Panagiotis Kanavos

1
Bu ipucu için teşekkürler! Bu bana çok yardımcı oldu. Verileri SQL 2008 R2'den SQL 2008'e
kopyaladım

8

Bunu deneyebilirsiniz.

  1. SQL Server 2008 üzerine bir veritabanı oluşturun.
  2. Verileri İçe Aktar özelliğini kullanarak SQL Server R2'den (veya daha yüksek bir sürümden) verileri içe aktarın.
  3. komut dosyasını senkronize etmek için "RedGate SQLCompare" kullanın.

6

Go Task-> kodları oluştur ...

In Gelişmiş içinde "komut dosyası için veri türleri" seçmek "Schema and data"ve alt sürümde bu komut dosyasını çalıştırmak için deneyin.


5
Bu çok iyi bir çözümdür ancak daha büyük veritabanlarında çok zayıf çalışır.
veljasije

5

Güzel değil, ama bu şekilde SQL 2008 R2 kurulumunuzda bu seçeneğin yüklü olmasını sağladım.

1) SQL Server 2008 R2 "Görevler" de veritabanına sağ tıklayın. Sihirbazda "Komut dosyaları oluştur", ilk adımda tüm veritabanını ve nesneleri seçin. "Komut Dosyası Seçeneklerini Ayarla" adımında "Gelişmiş" düğmesini görmelisiniz, bunu seçin ve R2 sürümü yerine "Sunucu Sürümü için Komut Dosyası" = SQL Server 2008 "seçeneğini seçtiğinizden emin olun. tek başına tüm birincil anahtarları, yapıları ve saklı yordamlar gibi diğer nesneleri getirmez. "

2) Sorgu penceresini kullanarak yeni yükleme veya veritabanı örneği SQL Express veya SQL Server 2008'de oluşturulan SQL komut dosyasını çalıştırın veya kaydedilmiş .sql komut dosyasını açın ve çalıştırın ve yeni veritabanını görmelisiniz.

3) Şimdi yeni veritabanına sağ tıklayın ve "Görevler" i seçin. "Verileri İçe Aktar ..", R2 veritabanı olarak kaynak ve yeni veritabanı olarak hedefi seçin. "Bir veya daha fazla tablo veya görünümden veri kopyalayın", tüm tabloları seçmek için en üstteki onay kutusunu seçin ve ardından bir sonraki adımda paketi çalıştırın ve her şeyin eski bir sürümde olması gerekir. Bu, 2005 sürümüne geri dönmek için de işe yarayacaktır. Umarım bu birisine yardım eder.


merhaba @motogeek, ben aynı sorunu var, ama R2 üretim sunucusu ve 2008 yerel var, bu durumda ben ithalat ve ihracat verileri kullanamazsınız. bunun için ideal çözüm ne olurdu?
Abbas

2

BCP'yi küçük tablolar için içeri ve dışarı kullanabilirsiniz.

BCP OUT komutu: -

BCP "SELECT *  FROM [Dinesh].[dbo].[Invoices]" QUERYOUT C:\av\Invoices1.txt -S MC0XENTC -T -c -r c:\error.csv

BCP IN komutu: - Invoicescopy1 için tablo yapısı oluşturun.

BCP [Dinesh].[dbo].[Invoicescopy1] IN C:\av\Invoices.txt -S MC0XENTC -T -c

0

Bunun eski bir gönderi olduğunu takdir ediyorum, ancak Azure Geçiş Sihirbazı'nın (Codeplex'te kullanılabilir - Codeplex'in şu anda yazdığım gibi bağlanamadığı) bunu kolayca yapacağını bilmesi yararlı olabilir.


Bu araç, SQL Server Veri Taşıma Yardımcısı ile değiştirildi. Bkz. Stackoverflow.com/questions/46517060/…
ahwm

0

Her şeyi taşımak için SSMS'deki İçe / Dışa Aktarma sihirbazlarını kullanmanız gerekir

Yedekleme / geri yükleme veya ayırma / ekleme özelliğini kullanarak "sürüm düşürme" mümkün değildir. Bu nedenle yapmanız gereken:

  1. Yeni SSMS / SQL sürümünü çalıştıran sunucudan veritabanını yedekleyin.
  2. "Görevler" menüsünü genişleterek (hedef veritabanına sağ tıkladıktan sonra) ve "Verileri İçe Aktar" seçeneğini belirleyerek oluşturulan .bak dosyasından veri aktarın.

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.