Paglilipat ng backup na data mula sa isang bagong bersyon ng MS SQL Server sa isang mas lumang bersyon

prehistory

Minsan, upang magparami ng isang bug, kailangan ko ng backup ng database ng produksyon.

Sa aking sorpresa, nakatagpo ako ng mga sumusunod na limitasyon:

  1. Ang database backup ay ginawa sa bersyon SQL Server 2016 at hindi tugma sa akin SQL Server 2014.
  2. Sa aking computer sa trabaho ang OS ay Windows 7kaya hindi ako nakapag update SQL Server hanggang sa bersyon 2016
  3. Ang sinusuportahang produkto ay bahagi ng isang mas malaking system na may mahigpit na pinagsamang legacy na arkitektura at na-access din ang iba pang mga produkto at base, kaya maaaring tumagal ng napakatagal na oras upang ma-deploy sa ibang istasyon.

Isinasaalang-alang ang nasa itaas, dumating ako sa konklusyon na ang oras ay dumating na para sa mga saklay ng hindi karaniwang mga solusyon.

Pagpapanumbalik ng data mula sa backup

Nagpasya akong gumamit ng virtual machine Oracle VM VirtualBox gamit ang Windows 10 (maaari kang kumuha ng pagsubok na imahe para sa Edge browser kaya). Ang SQL Server 2016 ay na-install sa virtual machine at ang database ng application ay naibalik mula sa isang backup (pagtuturo).

Pag-set up ng access sa SQL Server sa isang virtual machine

Susunod, kinailangan na gumawa ng ilang hakbang upang gawing posible na ma-access ang SQL Server mula sa labas:

  1. Para sa firewall, magdagdag ng panuntunan upang payagan ang mga kahilingan sa port na pumasa 1433.
  2. Maipapayo na ang pag-access sa server ay nangyayari hindi sa pamamagitan ng pagpapatunay ng Windows, ngunit sa pamamagitan ng SQL gamit ang isang pag-login at password (mas madaling i-configure ang pag-access). Gayunpaman, sa kasong ito, dapat mong tandaan na paganahin ang SQL authentication sa mga katangian ng SQL Server.
  3. Sa mga setting ng user sa SQL Server sa tab Pagma-map ng Gumagamit tukuyin ang tungkulin ng user para sa naibalik na database db_securityadmin.

Paglipat ng data

Sa totoo lang, ang paglipat ng data mismo ay binubuo ng dalawang yugto:

  1. Paglilipat ng schema ng data (mga talahanayan, view, nakaimbak na pamamaraan, atbp.)
  2. Paglilipat ng data mismo

Paglipat ng Data Schema

Ginagawa namin ang mga sumusunod na operasyon:

  1. piliin Mga Gawain -> Bumuo ng Mga Script para sa isang portable na base.
  2. Piliin ang mga bagay na kailangan mong ilipat o iwanan ang default na halaga (sa kasong ito, ang mga script ay gagawin para sa lahat ng mga object ng database).
  3. Tukuyin ang mga setting para sa pag-save ng script. Ang pinaka-maginhawang paraan ay ang pag-save ng script sa isang file sa Unicode encoding. Pagkatapos, kung may pagkabigo, hindi mo na kailangang ulitin muli ang lahat ng mga hakbang.

Kapag nai-save na ang script, maaari itong isagawa sa source na SQL Server (lumang bersyon) upang lumikha ng kinakailangang database.

Babala: Pagkatapos isagawa ang script, kailangan mong suriin ang pagkakapare-pareho ng mga setting ng database mula sa backup at ang database na nilikha ng script. Sa aking kaso, ang script ay walang setting para sa COLLATE, na humantong sa isang pagkabigo kapag naglilipat ng data at sumasayaw gamit ang isang tamburin upang muling likhain ang database gamit ang pinalaki na script.

Paglipat ng data

Bago maglipat ng data, dapat mong huwag paganahin ang pagsuri sa lahat ng mga paghihigpit sa database:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Isinasagawa ang paglilipat ng data gamit ang Data Import Wizard Mga Gawain -> Mag-import ng Data sa SQL Server, kung saan matatagpuan ang database na nilikha ng script:

  1. Tukuyin ang mga setting ng koneksyon sa pinagmulan (SQL Server 2016 sa isang virtual machine). Gumamit ako ng Data Source SQL Server ng Native na Kliyente at ang nabanggit na SQL authentication.
  2. Tinukoy namin ang mga setting ng koneksyon sa patutunguhan (SQL Server 2014 sa host machine).
  3. Susunod na itinakda namin ang pagmamapa. Dapat mong piliin ang lahat hindi read-only mga bagay (halimbawa, hindi kailangang piliin ang mga view). Dapat pumili ng mga karagdagang opsyon "Pahintulutan ang pagpasok sa mga column ng pagkakakilanlan", kung ito ay ginagamit.
    Babala: kung susubukan mong pumili ng ilang mga talahanayan at italaga ang ari-arian sa kanila "Pahintulutan ang pagpasok sa mga column ng pagkakakilanlan" ang property ay naitakda na dati para sa hindi bababa sa isa sa mga napiling talahanayan, ang dialog ay magsasaad na ang property ay naitakda na para sa lahat ng napiling mga talahanayan. Ang katotohanang ito ay maaaring nakakalito at humantong sa mga error sa paglilipat.
  4. Simulan na natin ang paglipat.
  5. Pagpapanumbalik ng constraint check:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Kung may anumang mga error na nangyari, sinusuri namin ang mga setting, tanggalin ang database na nilikha na may mga error, muling likhain ito mula sa script, gumawa ng mga pagwawasto at ulitin ang paglipat ng data.

Konklusyon

Ang gawaing ito ay medyo bihira at lumitaw lamang dahil sa mga limitasyon sa itaas. Ang pinakakaraniwang solusyon ay ang pag-upgrade ng SQL Server o kumonekta sa isang malayuang server kung pinapayagan ito ng arkitektura ng application. Gayunpaman, walang ligtas mula sa legacy code at mga baluktot na kamay ng hindi magandang kalidad na pag-unlad. Umaasa ako na hindi mo kakailanganin ang mga tagubiling ito, at kung kailangan mo ang mga ito, tutulungan ka nilang makatipid ng maraming oras at nerbiyos. Salamat sa iyong atensyon!

Listahan ng mga mapagkukunang ginamit

Pinagmulan: www.habr.com