Wiederherstellung der SQL Server-Datenbanksicherung in einer niedrigeren Version

185

Wie kann eine SQL Server-Datenbanksicherungsdatei einer höheren Version auf einem SQL Server einer niedrigeren Version wiederhergestellt werden?

Mit SQL Server 2008 R2 (10.50.1600) habe ich eine Sicherungsdatei erstellt und möchte sie jetzt auf dem SQL Server 2008 (10.00.1600) meines Live-Servers wiederherstellen .

Beim Versuch, die Sicherung auf SQL Server 2008 wiederherzustellen, wird ein Fehler ausgegeben, z. Restore FailedB.:

Die Datenbank wurde auf einem Server mit Version 10.50.1600 gesichert. Diese Version ist nicht mit diesem Server kompatibel, auf dem Version 10.00.1600 ausgeführt wird.

Wie stelle ich die Sicherungsdatei auf diesem Server wieder her?

Oreo
quelle
2
Sie können dies nicht tun - es ist einfach nicht möglich. SQL Server erlaubt kein * Downgrade "einer Datenbank von einer höheren Version auf eine niedrigere.
marc_s
18
Microsoft weiß alles über SQL Server (seit es erstellt wurde) und dennoch ist es unmöglich, Daten zwischen zwei Versionen zu verschieben. Ich verstehe einfach nicht, warum eine Art Kompatibilitätsmodus beim Export nicht verfügbar ist. Wie schwer kann es sein?
DVD
1
@dvdmn so hart wie jede Top Gear-Episode, in der sie das sagen - verschiedene Typen, verschiedene Anweisungen, verschiedene Blocklayouts. Das Verschieben von Daten zwischen Datenbanken ist unabhängig von den beteiligten Versionen sehr einfach. Ein Downgrade ist es jedoch nicht .
Panagiotis Kanavos
2
@PanagiotisKanavos Ich bin anderer Meinung, in MySQL können Sie DB als SQL-Befehle exportieren und auf jeder Version von MySQL (nach unten oder oben) wiederherstellen. Ja, Sie können SQL DB auch als Skript exportieren, aber das Wiederherstellen ist nicht einfach, wenn Sie einige gespeicherte Funktionen / Prozeduren haben, die voneinander abhängen. Es ist grundsätzlich nicht nützlich / Lösung.
DVD
3
@dvdmn eine Datenbank des Scripts zu exportieren ist völlig verschieden von der Sicherung. Mir ist klar, dass einige Produkte keine Backup / Restore-Funktionalität bieten oder, schlimmer noch, die beiden Konzepte durcheinander bringen. Dies geschieht häufig aus historischen Gründen: In der Vergangenheit fehlten einige Produkte, die als Export / Scripting mit diesem Namen bezeichnet wurden. Jetzt müssen sie
Termkonflikte

Antworten:

78

Nein, ein Downgrade einer Datenbank ist nicht möglich. 10.50.1600 ist die SQL Server 2008 R2- Version. Es gibt absolut keine Möglichkeit, diese Datenbank wiederherzustellen oder an die SQL Server 2008-Instanz anzuhängen, auf der Sie wiederherstellen möchten (10.00.1600 ist SQL Server 2008). Ihre einzigen Optionen sind:

  • Aktualisieren Sie diese Instanz auf SQL Server 2008 R2 oder
  • Stellen Sie die Sicherung auf einer SQL Server 2008 R2-Instanz wieder her, exportieren Sie alle Daten und importieren Sie sie in eine SQL Server 2008-Datenbank.
Remus Rusanu
quelle
Ich kann den Live-Server des Clients aufgrund von Berechtigungsbeschränkungen nicht aktualisieren. und meine Datenbankgröße ist über 2,5 GB, so dass ich aufgrund eines Speicherausnahmefehlers kein Datenskript erstellen konnte.
9
@Gaurav Skripten Sie die Daten nicht aus - schreiben Sie stattdessen die gesamte Datenbank (Tabellen, Prozesse, Trigger, Einschränkungen usw.) ohne Daten aus, erstellen Sie die neue Datenbank, klicken Sie mit der rechten Maustaste auf die Quellendatenbank und gehen Sie dann zu "Extras" "Daten exportieren", um den Inhalt der Tabellen in Ihre Datenbank zu übertragen.
Jim McLeod
17
Ich bin sehr misstrauisch gegenüber einer Antwort "Es gibt keinen möglichen Weg" - das bedeutet nur, dass Sie den Weg noch nicht gefunden haben. Es kann viele Gründe geben, warum Sie dies tun möchten, daher ist dies keine hilfreiche Antwort.
Jay Imerman
6
Ich bin anderer Meinung, @Jay, manchmal ist "Sie können nicht" die perfekte Antwort, obwohl es sinnvoller ist, Problemumgehungen anzubieten, sofern verfügbar.
Russell Fox
1
@ Zhang Wenn Sie Fragen haben, stellen Sie diese als Fragen, nicht als Kommentar.
Remus Rusanu
83

Sie können die als Export Data-Tier Application bezeichnete Funktion verwenden, die eine .bacpacDatei generiert , die aus einem Datenbankschema und Daten besteht.

Auf dem Zielserver können Sie die Option Datenebenenanwendung importieren verwenden, mit der eine neue Datenbank aus einer zuvor erstellten .bacpacDatei erstellt und gefüllt wird

Wenn Sie nur das Datenbankschema übertragen möchten, können Sie Datenebenenanwendung extrahieren zum Erstellen von Dateien und Datenebenenanwendung zum Bereitstellen des erstellten Datenbankschemas bereitstellen verwenden .

Ich habe diesen Prozess auf verschiedenen Versionen von SQL Server von SQL 2014 bis SQL 2012 und von SQL 2014 bis SQL 2008R2 ausprobiert und gut funktioniert.

veljasije
quelle
8
Dies ist eine Antwort, die mehr Aufmerksamkeit verdient. In den meisten Fällen funktioniert es tatsächlich nur. Wenn dort jedoch verwaiste SQL-Benutzer vorhanden sind, schlagen die Exportvorgänge fehl. Sie können diese Bits jederzeit manuell entfernen / hinzufügen, um ansonsten SQL-Versionen zu überschreiten.
Doktor Blue
3
Ich habe gerade versucht, eine Datenbank zu erstellen, die auf MSSQLEX2014 (V12) auf meinem MSSQLEX2012 (V11) erstellt wurde. Ich erhalte nur den Fehler "Microsoft.Data.Tools.Schema.Sql.Sql120DatabaseSchemaProvider ist ungültig", ohne dass eine Änderung möglich ist.
Craig
5
Das Importieren von SQL Server 2014 bis 2012 mit einem .bakpac funktioniert, erfordert jedoch die richtige Version von SSMS. Zum Beispiel verwende ich SSMS 2016 CTP3 und es hat einwandfrei funktioniert. Es hat bei mir mit SSMS 2012 NICHT funktioniert. Ich habe SSMS 2014 nicht getestet.
Greg Gum
1
Weiß jemand, ob man diese Prozedur in T-SQL schreiben kann ? UPDATE (antworte mir nach einigem googeln): Sie können dies über die sqlpackage.exeBefehlszeile automatisieren . Google für mehr.
Alex
1
Dies ist die einzige Lösung, die für mich zum Herabstufen von ziemlich großem / kompliziertem SQL2017 auf SQL2016 funktioniert hat. Leistung auch sehr gut.
Keith bläst
35

Wird nicht unbedingt funktionieren

Wird funktionieren

  • Skriptgenerierung - Aufgaben -> Skripte generieren . Stellen Sie sicher, dass Sie die gewünschte SQL Server-Zielversion auf der Seite Set Scripting Options -> Advanced festlegen. Dort können Sie auch auswählen, ob Schema, Daten oder beides kopiert werden sollen. Beachten Sie, dass Sie im generierten Skript möglicherweise den Ordner DATA für die mdf / ldf-Dateien ändern müssen, wenn Sie von non-express zu express oder umgekehrt wechseln.

  • Microsoft SQL Server Database Publishing Services - wird mit SQL Server 2005 und höher geliefert, denke ich. Laden Sie die neueste Version von hier . Voraussetzungen: sqlncli.msi/ sqlncli_x64.msi/ sqlncli_ia64.msi, SQLServer2005_XMO.msi/ SQLServer2005_XMO_x64.msi/ SQLServer2005_XMO_ia64.msi( hier herunterladen ).

Ohad Schneider
quelle
7
Die Skriptgenerierung ist für umfangreiche Datenbanken unzuverlässig. Vermeiden Sie dies, wenn dies überhaupt möglich ist.
Chris
Beide Links unten sind 404.
Sнаđошƒаӽ
29

Hier sind meine 2 Cent für verschiedene Optionen, um dies zu vervollständigen:

Tools von Drittanbietern : Der wahrscheinlich einfachste Weg, die Aufgabe zu erledigen, besteht darin, eine leere Datenbank in einer niedrigeren Version zu erstellen und dann die Sicherung mithilfe von Tools von Drittanbietern zu lesen und die neu erstellte Datenbank mit der Sicherung zu synchronisieren.

Red Gate ist eines der beliebtesten, aber es gibt viele andere wie ApexSQL Diff , ApexSQL Data Diff , Adept SQL , Idera …. All dies sind Premium-Tools, aber Sie können die Arbeit im Testmodus erledigen;)

Generieren von Skripten : Wie bereits erwähnt, können Sie die Struktur und Daten von Skripten immer mit SSMS ausführen, müssen jedoch die Ausführungsreihenfolge berücksichtigen. Standardmäßig sind Objektskripte nicht korrekt sortiert und Sie müssen sich um die Abhängigkeiten kümmern. Dies kann ein Problem sein, wenn die Datenbank groß ist und viele Objekte enthält.

Import- und Exportassistent : Dies ist keine ideale Lösung, da nicht alle Objekte, sondern nur Datentabellen wiederhergestellt werden. Sie können ihn jedoch bei Bedarf für schnelle und fehlerhafte Korrekturen in Betracht ziehen.

Ken Williams
quelle
1
Red Gate Sql Clone unterstützt das Klonen zwischen verschiedenen Versionen von SQL Server nicht und meldet genau den gleichen Fehler, den ich erhalte, wenn ich dies manuell versuche.
DarkDeny
29

Sie können die in der oberen Version erstellte Datenbank (oder das Anhängen) nicht in der unteren Version wiederherstellen. Die einzige Möglichkeit besteht darin, ein Skript für alle Objekte zu erstellen und das Skript zum Generieren der Datenbank zu verwenden.

Geben Sie hier die Bildbeschreibung ein

Wählen Sie "Schema und Daten" - wenn Sie beide Elemente in die Sicherungsskriptdatei aufnehmen möchten,
wählen Sie Nur Schema - wenn nur Schema benötigt wird.

Geben Sie hier die Bildbeschreibung ein

Ja, jetzt haben Sie das Skript mit Schema und Daten der Datenbank erstellen erstellt.

Smit Patel
quelle
16

Eine andere Möglichkeit, dies zu tun, ist die Verwendung der Funktion "Datenbank kopieren":

Suchen Sie, indem Sie mit der rechten Maustaste auf die Quellendatenbank> "Aufgaben"> "Datenbank kopieren" klicken.

Sie können die Datenbank in eine niedrigere Version der SQL Server-Instanz kopieren. Dies funktionierte für mich von SQL Server 2008 R2 (SP1) - 10.50.2789.0 bis Microsoft SQL Server 2008 (SP2) - 10.0.3798.0

Joy Walker
quelle
3
Beachten Sie, dass dies nicht funktioniert, wenn das Ziel SQL Server Express ist. "Der Zielserver kann keine Express-Instanz von SQL Server 2005 oder höher sein." social.msdn.microsoft.com/Forums/en-US/sqlgetstarted/thread/…
Ohad Schneider
2
Auf diese Weise ist es auch nicht möglich, eine Datenbank von SQL Server 2012 nach SQL Server 2008 zu kopieren.
Twinkles
1
Die Datenbank kopieren ist ein Vorgang zum
Trennen
1
Danke für diesen Hinweis! Das hat mir sehr geholfen. Ich habe die Daten von SQL 2008 R2 nach SQL 2008 kopiert.
dns_nx
8

Sie können dies versuchen.

  1. Erstellen Sie eine Datenbank auf SQL Server 2008.
  2. Verwenden der Funktion "Daten importieren" Importieren Sie Daten aus SQL Server R2 (oder einer höheren Version).
  3. Verwenden Sie "RedGate SQLCompare", um das Skript zu synchronisieren.
Ishtiyaq Khan
quelle
6

Gehen Sie zu Aufgabe-> Skripte generieren ...

In Erweitern in „Typen von Daten für Skript“ wählen "Schema and data"und versuchen , dieses Skript in Ihrer älteren Version zu laufen.

Mathewsun
quelle
5
Dies ist eine sehr gute Lösung, funktioniert aber bei größeren Datenbanken sehr schlecht.
Veljasije
5

Es ist nicht schön, aber so habe ich es gemacht, vorausgesetzt, Sie haben diese Option auf Ihrer SQL 2008 R2-Installation installiert.

1) Klicken Sie mit der rechten Maustaste auf Datenbank in SQL Server 2008 R2 "Aufgaben". Wählen Sie im Assistenten "Skripte generieren" aus und wählen Sie im ersten Schritt die gesamte Datenbank und die Objekte aus. Im Schritt "Skriptoptionen festlegen" sollte die Schaltfläche "Erweitert" angezeigt werden. Wählen Sie diese aus und stellen Sie sicher, dass Sie "Skript für Serverversion" = SQL Server 2008 "und nicht R2-Version auswählen. Dies ist ein entscheidender Schritt, da" Daten importieren ". an sich bringt nicht alle Primärschlüssel, Constrianten und andere Objekte wie gespeicherte Prozeduren mit. "

2) Führen Sie das auf der neuen Installations- oder Datenbankinstanz SQL Express oder SQL Server 2008 generierte SQL-Skript über das Abfragefenster aus oder öffnen Sie das gespeicherte SQL-Skript und führen Sie es aus. Die neue Datenbank sollte angezeigt werden.

3) Klicken Sie nun mit der rechten Maustaste auf die neue Datenbank und wählen Sie "Aufgaben". "Daten importieren". Wählen Sie die Quelle als R2-Datenbank und das Ziel als neue Datenbank. "Daten aus einer oder mehreren Tabellen oder Ansichten kopieren", aktivieren Sie das obere Kontrollkästchen, um alle Tabellen auszuwählen, und führen Sie dann im nächsten Schritt das Paket aus, und Sie sollten alles auf einer älteren Version haben. Dies sollte auch für die Rückkehr zu einer Version von 2005 funktionieren. Hoffe das hilft jemandem.

Motogeek
quelle
hi @motogeek, ich habe das gleiche Problem, aber ich habe das R2 auf dem Produktionsserver und 2008 auf lokal, in diesem Fall kann ich die Import- und Exportdaten nicht verwenden. Was wäre die ideale Lösung dafür?
Abbas
2

Sie können BCP für kleine Tabellen verwenden.

BCP OUT Befehl: -

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

BCP IN-Befehl: - Tabellenstruktur für Invoicescopy1 erstellen.

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

Ich weiß, dass dies ein alter Beitrag ist, aber es kann hilfreich sein, zu wissen, dass der Azure-Migrationsassistent (verfügbar in Codeplex - kann nicht mit Codeplex verknüpft werden, da Codeplex dies derzeit tut) dies problemlos erledigt.

tony.wiredin
quelle
Dieses Tool wurde durch den SQL Server-Datenmigrationsassistenten ersetzt. Siehe: stackoverflow.com/questions/46517060/…
ahwm
0

Sie müssten die Import / Export-Assistenten in SSMS verwenden, um alles zu migrieren

Es ist kein "Downgrade" durch Sichern / Wiederherstellen oder Trennen / Anhängen möglich. Deshalb müssen Sie Folgendes tun:

  1. Sichern Sie die Datenbank von dem Server, auf dem die neue SSMS / SQL-Version ausgeführt wird.
  2. Importieren Sie Daten aus der generierten .bak-Datei, indem Sie das Menü "Aufgaben" erweitern (nachdem Sie mit der rechten Maustaste auf die Zieldatenbank geklickt haben) und die Option "Daten importieren" auswählen.
tonderaimuchada
quelle