Datenübertragung eines Backup der neuen Version von MS SQL Server auf eine ältere Version

Vorgeschichte

Einmal benötigte ich für die Reproduktion eines Fehlers ein Backup der Produktionsdatenbank.

Zu meinem Erstaunen stieß ich auf die folgenden Einschränkungen:

  1. Das Backup der Datenbank wurde auf der Version SQL Server 2016 erstellt und war nicht mit meiner SQL Server 2014.
  2. auf meinem Arbeitscomputer wurde als Betriebssystem Windows 7, daher konnte ich nicht auf SQL Server die Version 2016 aktualisieren.
  3. Das unterstützte Produkt war Teil eines größeren Systems mit stark verknüpfter Legacy-Architektur und bezog sich auch auf andere Produkte und Datenbanken, daher könnte die Bereitstellung auf einem anderen Rechner sehr zeitaufwändig sein.

Angesichts des Vorstehenden kam ich zu dem Schluss, dass es an der Zeit war, kreative Lösungen zu finden.

Datenwiederherstellung aus dem Backup

Ich beschloss, eine virtuelle Maschine Oracle VM VirtualBox mit Windows 10 zu verwenden (man kann ein Testabbild für den Browser Edge von hier). Auf der virtuellen Maschine wurde SQL Server 2016 installiert und die Anwendungsdatenbank wurde aus dem Backup wiederhergestellt (Anleitung).

Zugriff auf SQL Server in der virtuellen Maschine konfigurieren

Dann mussten einige Schritte unternommen werden, um den Zugriff auf den SQL Server von außen zu ermöglichen:

  1. Für die Firewall eine Regel hinzufügen, um Anfragen an den Port 1433.
  2. es wäre wünschenswert, dass der Zugriff auf den Server nicht über die Windows-Authentifizierung, sondern über SQL mit Login und Passwort erfolgt (es ist einfacher, den Zugriff zu konfigurieren). In diesem Fall darf man jedoch nicht vergessen, in den Eigenschaften des SQL Servers die Möglichkeit der SQL-Authentifizierung zu aktivieren.
  3. In den Benutzereinstellungen auf dem SQL Server auf dem Tab Benutzermapping die Rolle des Benutzers für die wiederhergestellte Datenbank anzugeben: db_securityadmin.

Datenübertragung

Die eigentliche Datenübertragung besteht aus zwei Phasen:

  1. Übertragung des Data Schemas (Tabellen, Ansichten, gespeicherte Prozeduren usw.)
  2. Übertragung der Daten selbst

Übertragung des Data Schemas

Wir führen die folgenden Operationen durch:

  1. Wählen Sie Tasks -> Skripte generieren für die übertragene Datenbank.
  2. Wir wählen die benötigten Objekte für die Übertragung aus oder lassen den Standardwert (in diesem Fall werden Skripte für alle Objekte der Datenbank erstellt).
  3. Wir geben die Einstellungen zum Speichern des Skripts an. Am bequemsten ist es, das Skript in einer einzigen Datei im Unicode-Format zu speichern. Im Falle eines Fehlers muss man nicht alle Schritte erneut durchführen.

Nach dem Speichern des Skripts kann es auf dem ursprünglichen SQL Server (alte Version) ausgeführt werden, um die erforderliche Datenbank zu erstellen.

Achtung: Nach der Ausführung des Skripts müssen die Datenbankeinstellungen des Backups mit denen der durch das Skript erstellten Datenbank überprüft werden. In meinem Fall fehlte im Skript die Einstellung für COLLATE, was zu einem Fehler beim Datenübertragungsprozess und zu Schwierigkeiten beim erneuten Erstellen der Datenbank mit dem ergänzten Skript führte.

Datenübertragung

Vor der Datenübertragung müssen alle Einschränkungen in der Datenbank deaktiviert werden:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Die Datenübertragung erfolgt über den Datenimport-Assistenten Tasks -> Import Data auf dem SQL Server, auf dem die durch das Skript erstellte Datenbank vorhanden ist:

  1. Wir geben die Verbindungseinstellungen zur Quelle an (SQL Server 2016 auf einer virtuellen Maschine). Ich habe Data Source verwendet SQL Server Native Client und die oben genannte SQL-Authentifizierung.
  2. Wir geben die Verbindungseinstellungen zum Ziel an (SQL Server 2014 auf der Host-Maschine).
  3. Anschließend konfigurieren wir das Mapping. Es müssen alle nicht schreibgeschützt Objekte (z. B. müssen keine Ansichten ausgewählt werden). Als zusätzliche Optionen sollte gewählt werden „Erlauben Sie das Einfügen in Identitätsspalten“, wenn solche verwendet werden.
    Achtung: wenn beim Versuch, mehrere Tabellen auszuwählen und ihnen eine Eigenschaft zuzuweisen, „Erlauben Sie das Einfügen in Identitätsspalten“ die Eigenschaft zuvor bereits für mindestens eine der ausgewählten Tabellen festgelegt wurde, wird im Dialogfeld angezeigt, dass die Eigenschaft bereits für alle ausgewählten Tabellen festgelegt wurde. Diese Tatsache kann verwirrend sein und zu Übertragungsfehlern führen.
  4. Wir starten die Übertragung.
  5. Wir stellen die Überprüfung der Einschränkungen wieder her:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Wenn Fehler auftreten, überprüfen wir die Einstellungen, löschen die erfolgreich erstellte Datenbank, erstellen sie aus dem Skript neu, nehmen Änderungen vor und wiederholen die Datenübertragung.

Fazit

Diese Aufgabe tritt recht selten auf und entsteht nur aufgrund der obgenannten Einschränkungen. Meistens besteht die Lösung in einem Update des SQL Servers oder der Verbindung zu einem entfernten Server, wenn dies die Architektur der Anwendung zulässt. Allerdings ist niemand vor Legacy-Code und ungeschickter Programmierung sicher. Ich hoffe, dass Sie diese Anleitung nicht benötigen, und falls doch, wird sie Ihnen helfen, viel Zeit und Nerven zu sparen. Vielen Dank für Ihre Aufmerksamkeit!

Liste der verwendeten Quellen

Quelle: habr.com

60GB SSD 8Gb DDR4