Transdonante rezervajn datumojn de nova versio de MS SQL Server al pli malnova versio

antaŭhistorio

Iam, por reprodukti cimon, mi bezonis sekurkopion de la produktada datumbazo.

Je mia surprizo, mi renkontis la jenajn limojn:

  1. La datumbaza sekurkopio estis farita sur la versio SQL-Servilo 2016 kaj ne estis kongrua kun mia SQL-Servilo 2014.
  2. Sur mia laborkomputilo, la OS uzata estis fenestroj 7do mi ne povis ĝisdatigi SQLa Servilo ĝis versio 2016
  3. La subtenata produkto estis parto de pli granda sistemo kun malloze kunligita heredaĵarkitekturo kaj ankaŭ parolis al aliaj produktoj kaj bazoj, do povus preni tre longan tempon por deploji ĝin al alia stacio.

Konsiderante la supre, mi alvenis al la konkludo, ke venis la tempo por lambastonoj de ne-normaj solvoj.

Restarigi datumojn de sekurkopio

Mi elektis uzi virtualan maŝinon Oracle VM VirtualBox kun Windows 10 (vi povas preni testan bildon por la retumilo Edge de ĉi tie). SQL Server 2016 estis instalita sur la virtuala maŝino kaj la aplika datumbazo estis restarigita de la sekurkopio (manlibro).

Agordante aliron al SQL-Servilo sur virtuala maŝino

Poste, estis necese fari kelkajn paŝojn por povi aliri SQL-Servilon de ekstere:

  1. Por la fajroŝirmilo, aldonu regulon por preterlasi havenpetojn 1433.
  2. Estas dezirinde, ke aliro al la servilo ne iru tra vindoza aŭtentikigo, sed tra SQL uzante ensaluton kaj pasvorton (estas pli facile agordi aliron). Tamen, en ĉi tiu kazo, vi devas memori ebligi SQL-Aŭtentikigon en la propraĵoj de SQL-Servilo.
  3. En uzant-agordoj sur SQL-Servilo sur la langeto Uzanto-Mapado specifu la uzantrolon por la restarigita datumbazo db_securityadmin.

Transdono de datumoj

Fakte, la transdono de datumoj mem konsistas el du etapoj:

  1. Transdono de datumoj de skemo (tabloj, vidoj, konservitaj proceduroj, ktp.)
  2. Transdono de la datumoj mem

Transdono de Datumoj

Ni plenumas la jenajn operaciojn:

  1. Elektu Taskoj -> Generu Skriptojn por portebla bazo.
  2. Elektu la objektojn, kiujn vi bezonas translokigi aŭ lasi la defaŭltan valoron (en ĉi tiu kazo, skriptoj estos kreitaj por ĉiuj datumbazaj objektoj).
  3. Indiku la agordojn por konservi la skripton. Estas plej oportune konservi la skripton en ununura Unikoda dosiero. Tiam, en kazo de malsukceso, vi ne bezonas ripeti ĉiujn paŝojn denove.

Post kiam la skripto estas konservita, ĝi povas esti rulita sur la originala SQL-Servilo (malnova versio) por krei la bezonatan bazon.

Averto: Post ekzekuti la skripton, vi devas kontroli la korespondadon inter la agordoj de la datumbazo de la sekurkopio kaj la datumbazo kreita de la skripto. En mia kazo, ne estis agordo por COLLATE en la skripto, kio kaŭzis malsukceson dum transdono de datumoj kaj dancado per tamburino por rekrei la datumbazon uzante la suplementan skripton.

Transdono de datumoj

Antaŭ transdoni datumojn, vi devas malŝalti la kontrolon de ĉiuj limigoj en la datumbazo:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Transdono de datumoj estas farita per la asistanto pri importado de datumoj Taskoj -> Importi Datumojn sur SQL-Servilo, kie troviĝas la datumbazo kreita de la skripto:

  1. Specifi la konekton agordojn al la fonto (SQL Server 2016 sur virtuala maŝino). Mi uzis Datumfonton SQL Server Denaska Kliento kaj la supre menciita SQL-aŭtentikigo.
  2. Specifu la konektajn agordojn por la celloko (SQL Server 2014 sur la gastiga maŝino).
  3. Poste, agordu la mapadon. Ĉiuj devas esti elektitaj ne nurlegebla objektoj (ekzemple vidoj ne bezonas esti elektitaj). Pliaj elektoj estu elektitaj "Permesi enmeton en identajn kolumnojn"se tiaj estas uzataj.
    Averto: se, kiam oni provas elekti plurajn tabelojn kaj agordi ilian posedaĵon "Permesi enmeton en identajn kolumnojn" la posedaĵo jam estis agordita por almenaŭ unu el la elektitaj tabeloj, la dialogo indikos, ke la posedaĵo jam estas agordita por ĉiuj elektitaj tabeloj. Ĉi tiu fakto povas esti konfuza kaj konduki al migraj eraroj.
  4. Ni komencas la translokigon.
  5. Restarigante la limkontrolon:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Se okazas iuj eraroj, ni kontrolas la agordojn, forigas la datumbazon kreitan kun eraroj, rekreas ĝin el la skripto, faras korektojn kaj ripetas la datumtransdonon.

konkludo

Ĉi tiu tasko estas sufiĉe malofta kaj aperas nur pro la supraj limigoj. La plej ofta solvo estas ĝisdatigi SQL-Servilon aŭ konekti al fora servilo se la aplikaĵarkitekturo permesas ĝin. Tamen neniu estas sekura kontraŭ hereda kodo kaj la kurbaj manoj de malbonkvalita evoluo. Mi esperas, ke vi ne bezonos ĉi tiujn instrukciojn, kaj se vi bezonas ilin, ili helpos vin ŝpari multan tempon kaj nervojn. Dankon pro via atento!

Listo de uzataj fontoj

fonto: www.habr.com