Överföra säkerhetskopieringsdata från en ny version av MS SQL Server till en äldre version

förhistoria

En gång, för att återskapa en bugg, behövde jag en säkerhetskopia av produktionsdatabasen.

Till min förvåning stötte jag på följande begränsningar:

  1. Databasbackupen gjordes på versionen SQL Server 2016 och var inte kompatibel med min SQL Server 2014.
  2. På min arbetsdator var OS Windows 7så jag kunde inte uppdatera SQL Server upp till version 2016
  3. Den understödda produkten var en del av ett större system med en tätt kopplad äldre arkitektur och fick även åtkomst till andra produkter och baser, så det kunde ta mycket lång tid att distribuera till en annan station.

Med tanke på ovanstående kom jag till slutsatsen att det är dags för kryckorna för icke-standardiserade lösningar.

Återställer data från backup

Jag bestämde mig för att använda en virtuell maskin Oracle VM VirtualBox med Windows 10 (du kan ta en testbild för Edge-webbläsaren hence). SQL Server 2016 installerades på den virtuella maskinen och applikationsdatabasen återställdes från en säkerhetskopia (instruktion).

Konfigurera åtkomst till SQL Server på en virtuell maskin

Därefter var det nödvändigt att vidta några steg för att göra det möjligt att komma åt SQL Server från utsidan:

  1. För brandväggen, lägg till en regel för att tillåta portförfrågningar att passera 1433.
  2. Det är tillrådligt att åtkomst till servern inte sker via Windows-autentisering, utan genom SQL med inloggning och lösenord (det är lättare att konfigurera åtkomst). Men i det här fallet måste du komma ihåg att aktivera SQL-autentisering i SQL Server-egenskaperna.
  3. I användarinställningarna på SQL Server på fliken Användarkartläggning ange användarrollen för den återställda databasen db_securityadmin.

Dataöverföring

Faktum är att själva dataöverföringen består av två steg:

  1. Överföra dataschema (tabeller, vyer, lagrade procedurer, etc.)
  2. Överföra själva data

Dataschemaöverföring

Vi utför följande operationer:

  1. Välj Uppgifter -> Generera skript för en bärbar bas.
  2. Välj de objekt du behöver överföra eller lämna standardvärdet (i det här fallet kommer skript att skapas för alla databasobjekt).
  3. Ange inställningar för att spara skriptet. Det bekvämaste sättet är att spara skriptet i en enda fil i Unicode-kodning. Sedan, om det uppstår ett fel, behöver du inte upprepa alla steg igen.

När skriptet har sparats kan det köras på SQL-källservern (gammal version) för att skapa den nödvändiga databasen.

Varning: Efter att ha kört skriptet måste du kontrollera konsistensen av databasinställningarna från säkerhetskopian och databasen som skapats av skriptet. I mitt fall hade skriptet ingen inställning för COLLATE, vilket ledde till ett misslyckande vid överföring av data och dans med en tamburin för att återskapa databasen med hjälp av det utökade skriptet.

Dataöverföring

Innan du överför data måste du inaktivera kontroll av alla begränsningar på databasen:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Dataöverföringen utförs med hjälp av dataimportguiden Uppgifter -> Importera data på SQL Server, där databasen som skapas av skriptet finns:

  1. Ange anslutningsinställningarna till källan (SQL Server 2016 på en virtuell maskin). Jag använde Data Source SQL Server Native Client och den tidigare nämnda SQL-autentiseringen.
  2. Vi anger anslutningsinställningarna till destinationen (SQL Server 2014 på värddatorn).
  3. Därefter satte vi upp kartläggningen. Du måste välja alla inte skrivskyddad objekt (exempelvis behöver vyer inte väljas). Ytterligare alternativ bör väljas "Tillåt infogning i identitetskolumner", om sådana används.
    Varning: om du försöker välja flera tabeller och tilldela egenskapen till dem "Tillåt infogning i identitetskolumner" egenskapen har redan ställts in tidigare för minst en av de valda tabellerna, dialogen kommer att indikera att egenskapen redan har ställts in för alla valda tabeller. Detta faktum kan vara förvirrande och leda till överföringsfel.
  4. Låt oss börja överföringen.
  5. Återställa begränsningskontrollen:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Om några fel uppstår kontrollerar vi inställningarna, tar bort databasen som skapats med fel, återskapar den från skriptet, gör korrigeringar och upprepar dataöverföringen.

Slutsats

Denna uppgift är ganska sällsynt och uppstår endast på grund av ovanstående begränsningar. Den vanligaste lösningen är att uppgradera SQL Server eller ansluta till en fjärrserver om applikationsarkitekturen tillåter det. Men ingen är säker från äldre kod och de krokiga händerna på utveckling av dålig kvalitet. Jag hoppas att du inte kommer att behöva dessa instruktioner, och om du behöver dem kommer de att hjälpa dig att spara mycket tid och nerver. Tack för din uppmärksamhet!

Lista över använda källor

Källa: will.com