Back-upgegevens overzetten van een nieuwe versie van MS SQL Server naar een oudere versie

prehistorie

Om een ​​bug te reproduceren, had ik ooit een back-up van de productiedatabase nodig.

Tot mijn verbazing liep ik tegen de volgende beperkingen aan:

  1. De databaseback-up is gemaakt op de versie SQL Server 2016 en was niet compatibel met mijn SQL Server 2014.
  2. Op mijn werkcomputer was het gebruikte besturingssysteem Windows 7dus ik kon niet updaten SQL Server tot versie 2016
  3. Het ondersteunde product maakte deel uit van een groter systeem met een nauw gekoppelde legacy-architectuur en sprak ook met andere producten en bases, dus het kon erg lang duren om het op een ander station te implementeren.

Gezien het bovenstaande kwam ik tot de conclusie dat het tijd is voor krukken van niet-standaard oplossingen.

Gegevens herstellen vanaf een back-up

Ik heb ervoor gekozen om een ​​virtuele machine te gebruiken Oracle VM VirtualBox met Windows 10 (u kunt een testbeeld maken voor de Edge-browser vandaar). SQL Server 2016 is op de virtuele machine geïnstalleerd en de toepassingsdatabase is hersteld vanaf de back-up (instructie).

Toegang tot SQL Server configureren op een virtuele machine

Vervolgens moesten enkele stappen worden ondernomen om van buitenaf toegang te krijgen tot SQL Server:

  1. Voeg voor de firewall een regel toe om poortverzoeken over te slaan 1433.
  2. Het is wenselijk dat de toegang tot de server niet via Windows-authenticatie gaat, maar via SQL met behulp van een login en wachtwoord (het is gemakkelijker om toegang in te stellen). In dit geval moet u er echter aan denken om SQL-verificatie in te schakelen in de SQL Server-eigenschappen.
  3. In gebruikersinstellingen op SQL Server op het tabblad Gebruikers in kaart brengen specificeer de gebruikersrol voor de herstelde database db_securityadmin.

Data overdracht

Eigenlijk bestaat de gegevensoverdracht zelf uit twee fasen:

  1. Overdracht van gegevensschema's (tabellen, weergaven, opgeslagen procedures, enz.)
  2. Zelf de gegevens overzetten

Overdracht van gegevensschema's

Wij voeren de volgende bewerkingen uit:

  1. kiezen Taken -> Scripts genereren voor een draagbare basis.
  2. Selecteer de objecten die u wilt overdragen of laat de standaardwaarde staan ​​(in dit geval worden scripts gemaakt voor alle database-objecten).
  3. Geef de instellingen op voor het opslaan van het script. Het is het handigst om het script op te slaan in een enkel Unicode-bestand. Dan hoeft u, in geval van een storing, niet alle stappen opnieuw te herhalen.

Zodra het script is opgeslagen, kan het worden uitgevoerd op de originele SQL Server (oude versie) om de vereiste basis te creëren.

Opmerking: Na het uitvoeren van het script moet u de overeenkomst controleren tussen de instellingen van de database uit de back-up en de database die door het script is gemaakt. In mijn geval was er geen instelling voor COLLATE in het script, wat leidde tot een fout bij het overbrengen van gegevens en het dansen met een tamboerijn om de database opnieuw te maken met behulp van het aangevulde script.

Data overdracht

Voordat u gegevens overdraagt, moet u de controle van alle beperkingen op de database uitschakelen:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

De gegevensoverdracht vindt plaats met behulp van de wizard voor het importeren van gegevens Taken -> Gegevens importeren op SQL Server, waar de database die door het script is gemaakt zich bevindt:

  1. Geef de verbindingsinstellingen op voor de bron (SQL Server 2016 op een virtuele machine). Ik heb gegevensbron gebruikt SQL Server Native-client en de eerder genoemde SQL-authenticatie.
  2. Geef de verbindingsinstellingen op voor de bestemming (SQL Server 2014 op de hostcomputer).
  3. Stel vervolgens de mapping in. Alles moet worden geselecteerd niet alleen-lezen objecten (aanzichten hoeven bijvoorbeeld niet te worden geselecteerd). Selecteer als aanvullende opties "Invoegen in identiteitskolommen toestaan"als die worden gebruikt.
    Opmerking: if, wanneer u probeert meerdere tabellen te selecteren en hun eigenschap in te stellen "Invoegen in identiteitskolommen toestaan" de eigenschap is al ingesteld voor ten minste één van de geselecteerde tabellen, het dialoogvenster geeft aan dat de eigenschap al is ingesteld voor alle geselecteerde tabellen. Dit feit kan verwarrend zijn en tot migratiefouten leiden.
  4. We beginnen met de overdracht.
  5. Beperkingscontrole herstellen:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Als er fouten optreden, controleren we de instellingen, verwijderen we de database die met fouten is gemaakt, maken we deze opnieuw op basis van het script, brengen we correcties aan en herhalen we de gegevensoverdracht.

Conclusie

Deze taak is vrij zeldzaam en treedt alleen op vanwege de bovenstaande beperkingen. De meest gebruikelijke oplossing is om SQL Server te upgraden of verbinding te maken met een externe server als de toepassingsarchitectuur dit toestaat. Niemand is echter immuun voor legacy-code en kromme handen van slechte ontwikkeling. Ik hoop dat je deze instructie niet nodig hebt, maar als je hem nog steeds nodig hebt, zal het je veel tijd en zenuwen helpen besparen. Bedankt voor uw aandacht!

Lijst met gebruikte bronnen

Bron: www.habr.com