Abwärtskompatibilität von SQL Server 2012 für Sicherungen mit 2008

14

Ich habe eine Reihe von Clients mit SQL Server 2008 und das habe ich auch hier auf meinem Server. Ich verwende Sicherungsdateien, um Datenbanken zwischen Kunden und in meinem Büro hin und her zu senden.

Ich habe gelesen, dass es beim Erstellen eines Backups von SQL Server 2012 keine Möglichkeit gibt, es auf einer 2008-Instanz wiederherzustellen. Ich nahm an, dass der Kompatibilitätsgrad dieses Problem lösen würde, aber das ist nicht der Fall. Daher bin ich nicht in der Lage, ein Upgrade durchzuführen. Abgesehen davon, dass alle meine Kunden auf einmal aktualisiert werden, was unmöglich ist, kann ich mir keinen sauberen Weg vorstellen, dies zu tun.

Ich muss eine Datenbank an einen Client senden sowie eine Datenbank von einem Client empfangen. Dies ist mein erstes Versions-Upgrade auf SQL Server, daher ist dieses Problem für mich neu. Irgendwelche Ideen, wie es weitergehen soll?

Jeff Stock
quelle
4
Auf Ihrem Server können gleichzeitig eine Instanz von SQL Server 2008 und eine Instanz von SQL Server 2012 mit unterschiedlichen Instanznamen installiert sein. Vielleicht würde das Ihre Probleme mit Kunden auf verschiedenen Versionen lösen?
Mikael Eriksson
Ähnliche Frage zu SO: stackoverflow.com/q/1744808/95710
DForck42

Antworten:

16

Hier geht es um zwei Dinge: die Versionsnummer der Datei und den Kompatibilitätsgrad. Wenn Sie eine Datenbank an eine neuere Hauptversion anhängen (z. B. von 2008 bis 2008R2 oder 2008R2 bis 2012), wird die Datenbankversion dauerhaft geändert, und Sie können diese Datenbank nicht erneut an eine ältere Version anhängen.

Die Kompatibilitätsstufe dient zum Analysieren von veraltetem T-SQL, das in älteren Versionen von SQL Server verwendet wurde. Es ändert nichts daran, wie die Daten auf der Festplatte gespeichert werden.

Um die Datenbank einer älteren Version von SQL Server zu übergeben, müssen Sie die Daten exportieren und in eine andere Datenbank importieren. Hilfsmittel wie Data Compare von Red Gate sind hierfür hilfreich.

Brent Ozar
quelle
Ja, ich hatte genau das gleiche Problem. Skripting für die gesamte Datenbank und dann für alle Daten. Red Gates SQL Compare und Data Compare kamen an diesem Tag zur Hilfe.
DForck42
@ DForck42: In meinem Fall war die Datenbank zu groß, um mit Daten zu skripten, sodass ich das Schema am Ende skripten und die Daten dann mit verschieben konnte bcp.
ivan_pozdeev
@ivan_pozdeev Wollen Sie damit sagen, dass Sie mit SQL Server 2012 BCP exportiert und mit SQL Server 2008R2 BCP importiert haben? Seien Sie dankbar dafür, dass die Dateiformate kompatibel sind.
Chris
2
@Chris msdn.microsoft.com/en-us/library/ms162802.aspx "In SQL Server 2014 unterstützt das Dienstprogramm bcp systemeigene Datendateien, die mit SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2008 R2 und Windows 2000 kompatibel sind SQL Server 2012. "
ivan_pozdeev
Danke @ivan_posdeev, das war eine Offenbarung. Ich habe meine Schritte unten dokumentiert, falls es jemand anderem hilft.
Chris
6

Die Einstellung für den Kompatibilitätsgrad wird von SQL Server verwendet, um zu bestimmen, wie bestimmte neue Features behandelt werden sollen. Auf diese Weise kann eine Datenbank auf eine neuere Version von SQL migriert werden, ohne dass Probleme mit der Anwendung auftreten. Die Kompatibilitätsstufe kann vor und zurück geändert werden.

Leider sind die Sicherungsdateien nicht abwärtskompatibel. Eine Möglichkeit wäre, Ihre Daten mithilfe von Import / Export aus Ihrer aktuellen Datenbank in Ihre ältere Versionsinstanz zu verschieben.

StanleyJohns
quelle
3

Verwenden Sie für SQL-Migrationen den kostenlosen und quelloffenen SQL-Datenbankmigrationsassistenten.

Ich hatte eine 5 GB Datenbank mit ein paar ~ 10 Millionen Datensätzen und habe die Route über Generate Script ausprobiert und dann mit sqlcmd.exe ausgeführt. Erstens funktionierte das generierte Skript nicht immer richtig. Zweitens kann sqlcmd.exe auch bei großen Dateien fehlschlagen und sich über den verfügbaren Speicher beschweren. osql.exe funktioniert, benötigt aber nur Ewigkeiten (und hat dieselben Befehlszeilenargumente).

Dann bin ich auf ein wunderbares Tool zum Migrieren von SQL Server zu SQL Azure-Datenbanken gestoßen. Dies funktioniert auch für SQL Server nach SQL Server, wenn Sie beispielsweise eine SQL 2012-Datenbank nach 2008 R2 migrieren möchten. Es verwendet bcp.exe, das Massenkopien verwendet. Es gibt eine GUI- und eine Befehlszeilenversion (Batch) und es ist Open Source. Siehe http://sqlazuremw.codeplex.com/ . In meinem Fall dauerte die Operation 16 Minuten.

In einem erweiterten Bildschirm können Sie auswählen, dass Ihr Ziel SQL Server und nicht SQL Azure ist.

lvmeijer
quelle
2

Ich habe festgestellt, dass BCP effektiver ist als einige der Tools zum Abrufen von Daten in eine frühere Version von SQL Server und zum Abrufen von Daten aus RDS. (Danke @ivan_posdeev.)

Ich erstelle das Schema, indem ich mit der rechten Maustaste auf die Datenbank in SQL Server Management Studio, Aufgaben, Skripten erstellen klicke. Kreuzen Sie alle Objekte an, stellen Sie in erweiterten Objekten sicher, dass alle erforderlichen Skripte (Statistiken, Indizes usw.) erstellt werden. Deaktivieren Sie "Datenbank VERWENDEN", ​​wenn Ihre Zieldatenbank einen anderen Namen hat, und erstellen Sie eine Datei, die Ihr Schema erstellt. Erstellen Sie eine Datenbank auf Ihrem Ziel und führen Sie diese Datei darauf aus (mit osql,sqlcmd oder die GUI).

Führen Sie zum Verschieben der Daten die folgende Abfrage in der Quellendatenbank zweimal aus. Kommentieren Sie zuerst die zweite Spalte, um die Stapeldatei zum Extrahieren von Daten zu generieren, und kommentieren Sie dann die erste Spalte, um die auf Ihrem Ziel auszuführende Importstapeldatei zu generieren. (Sie müssen Ihre Quell- und Zielserver, Instanznamen, Ausgabe- und Eingabedateiverzeichnisse, Benutzernamen und Kennwörter hinzufügen. Um die integrierte Sicherheit zu verwenden, ersetzen Sie die Optionen und durch .)-U-P-T

Dies unterstützt Unicode. Wenn Sie dies nicht benötigen, ändern Sie den -NSchalter in beiden Anweisungen auf -n.

SELECT 
   'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME  + ' out d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
--    'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME  + ' in d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME  + '.ERRORS.dat'
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
ORDER BY 
    s.Name, t.NAME

Nach dem Ausführen werden die Prüfdateien mit dem Namen schema.tabellenname.ERRORS.dat - alle fehlgeschlagenen Zeilen einbezogen. Leer, wenn keine vorhanden sind.

Hier finden Sie eine MSDN-Referenz für BCP. Hier erfahren Sie mehr über die BCP-Optionen .

Ich habe festgestellt, dass dies der Erstellung von Skripten und den von mir ausprobierten Tools weit überlegen ist. Es kann auch auf RDS-Datenbanken ausgeführt werden (die keine Sicherungen zulassen). Die generierten Datendateien haben 30% der Größe der SQL-Skripte. Die Ausführung nimmt einen Bruchteil der Zeit in Anspruch und ist wesentlich zuverlässiger. (Die von SQL Server für die Skripterstellung generierten Skripte haben immer ausgelöst, manchmal vorhersehbar manchmal nicht, die generierte SQL war nicht kompatibel mit 2008R2 (z. B. verwendet nvarchar(0), oft nicht abgeschlossen, ohne erkennbaren Grund usw.). BCP repliziert auch Verstöße gegen Einschränkungen , wie referentielle Integrität.).

Chris
quelle