Bakgrund
En gÄng behövde jag en sÀkerhetskopia av produktionsdatabasen för att reproducera ett fel.
Till min förvÄning stötte jag pÄ följande begrÀnsningar:
- SÀkerhetskopian gjordes pÄ versionen SQL Server 2016 och var inte kompatibel med min SQL Server 2014.
- PÄ min arbet dator anvÀndes Windows 7, sÄ jag kunde inte uppgradera SQL Server till version 2016
- Den stödjade produkten var en del av ett större system med en starkt kopplad legacy-arkitektur och hÀnvisade ocksÄ till andra produkter och databaser, sÄ deployment pÄ en annan station kunde ta mycket tid.
Med detta i Ätanke kom jag fram till att det var dags för tillfÀlliga lösningar.
à terstÀllning av data frÄn sÀkerhetskopian
Jag bestÀmde mig för att anvÀnda en virtuell maskin med Windows 10 (man kan anvÀnda en testbild för webblÀsaren Edge ). PÄ den virtuella maskinen installerades SQL Server 2016 och databasen för applikationen ÄterstÀlldes frÄn sÀkerhetskopian ().
Konfigurera Ätkomst till SQL Server pÄ den virtuella maskinen
DÀrefter var det nödvÀndigt att vidta nÄgra steg för att möjliggöra Ätkomst till SQL Server utifrÄn:
- För brandvÀggen, lÀgg till en regel för att tillÄta förfrÄgningar till port 1433.
- Det Àr önskvÀrt att Ätkomsten till servern inte sker via Windows-autentisering, utan via SQL med anvÀndarnamn och lösenord (enklare att konfigurera Ätkomst). Men i detta fall fÄr man inte glömma att aktivera SQL-autentisering i SQL Servers egenskaper.
- I anvÀndarinstÀllningarna pÄ SQL Server, under fliken User Mapping ange rollen för den ÄterstÀllda databasen som db_securityadmin.
Ăverföring av data
SjÀlva överföringen av data bestÄr av tvÄ steg:
- Ăverföring av databasens schema (tabeller, vyer, lagrade procedurer osv.)
- Ăverföring av sjĂ€lva datan
Ăverföring av databasens schema
Utför följande operationer:
- VÀlj Tasks -> Generate Scripts för den överförda databasen.
- VÀlj objekten som ska överföras eller lÀmna vÀrdet som standard (i det hÀr fallet kommer skripten att skapas för alla databasens objekt).
- Ange instÀllningar för att spara skriptet. Det Àr lÀttast att spara skriptet i en enda fil i Unicode-kodning. DÄ behöver man inte upprepa alla steg vid en krasch.
Efter att skriptet har sparats kan det köras pÄ den ursprungliga SQL Server (Àldre version) för att skapa den nödvÀndiga databasen.
Observera: Efter att skriptet har körts Àr det nödvÀndigt att kontrollera att instÀllningarna för databasen matchar mellan sÀkerhetskopian och databasen som har skapats av skriptet. I mitt fall saknades instÀllningen för COLLATE i skriptet, vilket ledde till problem vid överföring av data och att man fick kÀmpa med att Äterskapa databasen med ett kompletterat skript.
Ăverföring av data
Innan överföring av data, mÄste alla begrÀnsningar i databasen stÀngas av:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'Dataöverföringen sker med hjÀlp av datainlÀsningsguiden. Tasks -> Import Data pÄ SQL Server dÀr databasen skapades med skriptet:
- Ange anslutningsinstÀllningar för kÀllan (SQL Server 2016 pÄ en virtuell maskin). Jag anvÀnde Data Source SQL Server Native Client och den nÀmnda SQL-autentiseringen.
- Ange anslutningsinstÀllningar för destinationen (SQL Server 2014 pÄ vÀrdmaskinen).
- DÀrefter konfigurerar vi mappningen. Det Àr nödvÀndigt att vÀlja alla inte read-only objekt (till exempel behöver vi inte vÀlja vyer). Som ytterligare alternativ bör vi vÀlja "TillÄt insÀttning i identity-kolumner", om sÄdana anvÀnds.
Observera: om man vid försök att markera flera tabeller och ange deras egenskap "TillÄt insÀttning i identity-kolumner" egenskap redan hade angetts för minst en av de markerade tabellerna, kommer det i dialogrutan att pÄpekas att egenskapen redan har angetts för alla markerade tabeller. Denna omstÀndighet kan förvirra och leda till överföringsfel. - Starta överföringen.
- Ă
terstÀll kontrollen av begrÀnsningar:
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'
Om det uppstÄr nÄgra fel, kontrollera instÀllningarna, ta bort den databas som skapades med fel, skapa den pÄ nytt frÄn skriptet, gör korrigeringar och upprepa dataöverföringen.
Slutsats
Denna uppgift dyker upp ganska sÀllan och orsakas endast av ovanstÄende begrÀnsningar. Oftast ligger lösningen i att uppgradera SQL Server eller ansluta till en fjÀrrserver, om applikationens arkitektur tillÄter det. Men ingen Àr skyddad mot legacy-kod och mindre bra utveckling. Jag hoppas att du inte kommer att behöva denna instruktion, men om du gör det, hoppas jag att den sparar dig mycket tid och nerver. Tack för uppmÀrksamheten!
Lista över anvÀnda kÀllor
KĂ€lla: habr.com
