Povestea
Odată, pentru a reproduce o eroare, aveam nevoie de un backup al bazei de date de producție.
Spre surprinderea mea, m-am confruntat cu următoarele limitări:
- Backup-ul bazei a fost realizat pe versiunea SQL Server 2016 și nu era compatibil cu SQL Server 2014.
- Pe computerul meu de lucru, sistemul de operare folosit era Windows 7, astfel că nu am putut să mă actualizez SQL Server la versiunea 2016
- Produsul suportat făcea parte dintr-un sistem mai mare cu o arhitectură legată strâns de legacy și se conecta, de asemenea, la alte produse și baze de date, așa că desfășurarea lui pe o altă stație ar fi putut dura foarte mult timp.
Având în vedere cele de mai sus, am ajuns la concluzia că a venit momentul unor soluții neconvenționale temporare.
Recuperarea datelor din backup
Am decis să folosesc o mașină virtuală cu Windows 10 (se poate lua o imagine de test pentru browserul Edge ). Pe mașina virtuală a fost instalat SQL Server 2016 și pe aceasta a fost restaurată baza de date a aplicației din backup ().
Configurarea accesului la SQL Server pe mașina virtuală
Apoi, a fost necesar să se întreprindă câțiva pași pentru a permite accesul la SQL Server din afară:
- Pentru firewall, adăugați o regulă de a permite solicitările pe portul 1433.
- Ideal ar fi ca accesul la server să nu se facă prin autentificarea Windows, ci prin SQL cu numele de utilizator și parola (mai ușor de configurat accesul). Totuși, în acest caz, nu trebuie uitat să se activeze în proprietățile SQL Server posibilitatea autentificării SQL.
- În setările utilizatorului pe SQL Server, pe tab-ul User Mapping specificați pentru baza de date restaurată rolul utilizatorului db_securityadmin.
Transferul de date
Transferul efectiv al datelor constă din două etape:
- Transferul schemei de date (tabele, vizualizări, proceduri stocate etc.)
- Transferul efectiv al datelor
Transferul schemei de date
Executăm următoarele operațiuni:
- Alegem Tasks -> Generate Scripts pentru baza de date ce urmează a fi transferată.
- Selectați obiectele dorite pentru transfer sau lăsați valoarea implicită (în acest caz, vor fi create scripturi pentru toate obiectele bazei).
- Specificați setările pentru salvarea scriptului. Cel mai convenabil este să salvați scriptul într-un singur fișier în codare Unicode. Astfel, în caz de eroare, nu va fi necesar să repetați toate etapele.
După salvarea scriptului, acesta poate fi executat pe SQL Server-ul inițial (versiunea veche) pentru a crea baza necesară.
Atenție: După executarea scriptului, este necesar să verificați conformitatea setărilor bazei de date din backup cu baza de date creată de script. În cazul meu, scriptul nu conținea configurația pentru COLLATE, ceea ce a dus la erori în timpul transferului de date și a necesitat recrearea bazei cu ajutorul unui script completat.
Transferul de date
Înainte de transferul datelor, este necesar să dezactivați toate restricțiile pe baza de date:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'Transferul datelor se efectuează cu ajutorul asistentului de import de date Tasks -> Import Data pe SQL Server, unde se află baza de date creată de script:
- Specificați setările de conectare la sursă (SQL Server 2016 pe o mașină virtuală). Eu am folosit Data Source SQL Server Native Client și autentificarea SQL menționată anterior.
- Specificați setările de conectare la destinație (SQL Server 2014 pe mașina gazdă).
- Apoi, configurăm mapping-ul. Este necesar să selectați toate obiectele care nu sunt de tip read-only (de exemplu, nu este necesar să selectați vederile). Ca opțiuni suplimentare, este necesar să selectați «Permiteți inserarea în coloanele de tip identity», dacă acestea sunt utilizate.
Atenție: dacă în timpul încercării de a selecta mai multe tabele și de a le seta proprietatea «Permiteți inserarea în coloanele de tip identity» proprietatea a fost deja stabilită anterior pentru cel puțin una dintre tabelele selectate, dialogul va indica faptul că proprietatea a fost deja stabilită pentru toate tabelele selectate. Acest aspect poate crea confuzie și poate duce la erori în transfer. - Lansați transferul.
- Restaurăm verificarea restricțiilor:
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'
Dacă apar erori, verificați setările, ștergeți baza de date creată cu erori, recreați-o din script, faceți corecturile necesare și repetați transferul datelor.
Concluzie
Această sarcină apare destul de rar și se datorează doar restricțiilor menționate mai sus. Cel mai adesea, soluția constă în actualizarea SQL Server sau conectarea la un server distant, dacă arhitectura aplicației permite acest lucru. Totuși, nimeni nu este protejat de codul vechi și de dezvoltarea de calitate slabă. Sper că nu veți avea nevoie de această instrucțiune, dar dacă totuși va fi necesară, sper să vă ajute să economisiți mult timp și nervi. Vă mulțumesc pentru atenție!
Lista surselor utilizate
Sursa: habr.com
