Overføring av sikkerhetskopidata fra en ny versjon av MS SQL Server til en eldre versjon

forhistorie

En gang, for å reprodusere en feil, trengte jeg en sikkerhetskopi av produksjonsdatabasen.

Til min overraskelse møtte jeg følgende begrensninger:

  1. Databasesikkerhetskopien ble laget på versjonen SQL Server 2016 og var ikke kompatibel med min SQL Server 2014.
  2. På min arbeidsdatamaskin var operativsystemet Windows 7så jeg kunne ikke oppdatere SQL Server opp til versjon 2016
  3. Det støttede produktet var en del av et større system med en tett koblet eldre arkitektur og fikk også tilgang til andre produkter og baser, så det kunne ta veldig lang tid å distribuere til en annen stasjon.

Med tanke på ovenstående, kom jeg til den konklusjon at tiden er inne for krykkene til ikke-standardiserte løsninger.

Gjenoppretter data fra sikkerhetskopi

Jeg bestemte meg for å bruke en virtuell maskin Oracle VM VirtualBox med Windows 10 (du kan ta et testbilde for Edge-nettleseren derav). SQL Server 2016 ble installert på den virtuelle maskinen og applikasjonsdatabasen ble gjenopprettet fra en sikkerhetskopi (instruksjon).

Sette opp tilgang til SQL Server på en virtuell maskin

Deretter var det nødvendig å ta noen skritt for å gjøre det mulig å få tilgang til SQL Server fra utsiden:

  1. For brannmuren, legg til en regel for å tillate portforespørsler å passere 1433.
  2. Det er tilrådelig at tilgang til serveren ikke skjer gjennom Windows-autentisering, men gjennom SQL ved hjelp av pålogging og passord (det er lettere å konfigurere tilgang). Men i dette tilfellet må du huske å aktivere SQL-autentisering i SQL Server-egenskapene.
  3. I brukerinnstillingene på SQL Server på fanen Brukerkartlegging spesifiser brukerrollen for den gjenopprettede databasen db_securityadmin.

Data overføring

Faktisk består selve dataoverføringen av to stadier:

  1. Overføring av dataskjema (tabeller, visninger, lagrede prosedyrer, etc.)
  2. Overføring av selve dataene

Dataskjemaoverføring

Vi utfører følgende operasjoner:

  1. Velg Oppgaver -> Generer skript for en bærbar base.
  2. Velg objektene du trenger å overføre eller la standardverdien være (i dette tilfellet vil skript bli opprettet for alle databaseobjekter).
  3. Angi innstillinger for lagring av skriptet. Den mest praktiske måten er å lagre skriptet i en enkelt fil i Unicode-koding. Deretter, hvis det er en feil, trenger du ikke å gjenta alle trinnene på nytt.

Når skriptet er lagret, kan det kjøres på kilden SQL Server (gammel versjon) for å opprette den nødvendige databasen.

Advarsel: Etter å ha kjørt skriptet, må du sjekke konsistensen av databaseinnstillingene fra sikkerhetskopien og databasen som er opprettet av skriptet. I mitt tilfelle hadde ikke skriptet en innstilling for COLLATE, noe som førte til en feil ved overføring av data og dans med en tamburin for å gjenopprette databasen ved hjelp av det utvidede skriptet.

Data overføring

Før du overfører data, må du deaktivere kontroll av alle restriksjoner på databasen:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Dataoverføring utføres ved hjelp av dataimportveiviseren Oppgaver -> Importer data på SQL Server, hvor databasen opprettet av skriptet er plassert:

  1. Angi tilkoblingsinnstillingene til kilden (SQL Server 2016 på en virtuell maskin). Jeg brukte datakilde SQL Server Native Client og den nevnte SQL-autentiseringen.
  2. Vi spesifiserer tilkoblingsinnstillingene til destinasjonen (SQL Server 2014 på vertsmaskinen).
  3. Deretter setter vi opp kartleggingen. Du må velge alle ikke skrivebeskyttet objekter (for eksempel trenger ikke visninger å velges). Ytterligere alternativer bør velges "Tillat innsetting i identitetskolonner", hvis slike brukes.
    Advarsel: hvis du prøver å velge flere tabeller og tilordne egenskapen til dem "Tillat innsetting i identitetskolonner" egenskapen er allerede tidligere satt for minst én av de valgte tabellene, dialogen vil indikere at egenskapen allerede er satt for alle valgte tabeller. Dette faktum kan være forvirrende og føre til overføringsfeil.
  4. La oss starte overføringen.
  5. Gjenopprette begrensningskontrollen:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Hvis det oppstår feil, kontrollerer vi innstillingene, sletter databasen som er opprettet med feil, gjenoppretter den fra skriptet, foretar korrigeringer og gjentar dataoverføringen.

Konklusjon

Denne oppgaven er ganske sjelden og oppstår bare på grunn av begrensningene ovenfor. Den vanligste løsningen er å oppgradere SQL Server eller koble til en ekstern server hvis applikasjonsarkitekturen tillater det. Imidlertid er ingen trygge for eldre kode og de skjeve hendene til utvikling av dårlig kvalitet. Jeg håper at du ikke trenger disse instruksjonene, og hvis du trenger dem, vil de hjelpe deg med å spare mye tid og nerver. Takk for din oppmerksomhet!

Liste over kilder som er brukt

Kilde: www.habr.com