KÄ izvairÄ«ties no Å”auÅ”anas sev kÄjÄ, izmantojot Liquibase
Nekad agrÄk nav noticis, un mÄs atkal!
NÄkamajÄ projektÄ mÄs nolÄmÄm izmantot Liquibase jau no paÅ”a sÄkuma, lai izvairÄ«tos no problÄmÄm nÄkotnÄ. KÄ izrÄdÄs, ne visi jaunie komandas biedri prot to pareizi lietot. Es rÄ«koju iekÅ”Äjo seminÄru, kuru pÄc tam nolÄmu pÄrvÄrst par rakstu.
RakstÄ ir iekļauti noderÄ«gi padomi un apraksts par trim acÄ«mredzamÄkajÄm kļūmÄm, kurÄs varat iekrist, strÄdÄjot ar relÄciju datu bÄzes migrÄcijas rÄ«kiem, jo āāÄ«paÅ”i ar Liquibase. ParedzÄts Java izstrÄdÄtÄjiem junioru un vidÄjÄ lÄ«menÄ«; pieredzÄjuÅ”Äkiem izstrÄdÄtÄjiem tas var bÅ«t interesants, lai strukturÄtu un atkÄrtotu to, kas, visticamÄk, jau ir zinÄms.
Liquibase un Flyway ir galvenÄs konkurÄjoÅ”Äs tehnoloÄ£ijas relÄciju struktÅ«ru versiju kontroles problÄmu risinÄÅ”anai Java pasaulÄ. Pirmais ir pilnÄ«gi bezmaksas, praksÄ visbiežÄk tiek izvÄlÄts lietoÅ”anai, tÄpÄc par izdevuma varoni tika izvÄlÄts Liquibase. TomÄr dažas no aprakstÄ«tajÄm praksÄm var bÅ«t universÄlas atkarÄ«bÄ no jÅ«su lietojumprogrammas arhitektÅ«ras.
RelÄciju struktÅ«ru migrÄcija ir piespiedu veids, kÄ tikt galÄ ar relÄciju datu krÄtuvju vÄjo elastÄ«bu. OOP modes laikmetÄ darba stils ar datu bÄzÄm nozÄ«mÄja, ka mÄs vienreiz aprakstÄm shÄmu un vairs nepieskaramies tai. TaÄu realitÄte vienmÄr ir tÄda, ka lietas mainÄs, un tabulas struktÅ«ras izmaiÅas ir nepiecieÅ”amas diezgan bieži. Protams, pats process var bÅ«t sÄpÄ«gs un nepatÄ«kams.
Es neiedziļinÄÅ”os tehnoloÄ£ijas aprakstÄ un instrukcijÄs bibliotÄkas pievienoÅ”anai jÅ«su projektam; par Å”o tÄmu ir rakstÄ«ts diezgan daudz rakstu:
VÄlos padalÄ«ties ar saviem padomiem un komentÄriem, kas dzimuÅ”i caur migrÄcijas problÄmu risinÄÅ”anas sviedriem, asinÄ«m un sÄpÄm.
1. Pirms darba uzsÄkÅ”anas jums jÄiepazÄ«stas ar labÄkÄs prakses sadaļu TieÅ”saistÄ Liquibase
Tur ir aprakstÄ«tas vienkÄrÅ”as, bet ļoti svarÄ«gas lietas, bez kurÄm bibliotÄkas lietoÅ”ana var sarežģīt dzÄ«vi. PiemÄram, nestrukturÄta pieeja izmaiÅu kopu pÄrvaldÄ«bai agrÄk vai vÄlÄk radÄ«s neskaidrÄ«bas un migrÄcijas traucÄjumus. Ja vienlaikus neievieÅ”at savstarpÄji atkarÄ«gas izmaiÅas datu bÄzes struktÅ«rÄ un pakalpojuma loÄ£ikÄ, pastÄv liela varbÅ«tÄ«ba, ka tas novedÄ«s pie sarkaniem testiem vai bojÄtas vides. TurklÄt ieteikumos par Liquibase lietoÅ”anu oficiÄlajÄ vietnÄ ir ietverta klauzula par atcelÅ”anas skriptu izstrÄdi un testÄÅ”anu kopÄ ar galvenajiem migrÄcijas skriptiem. Nu, rakstÄ https://habr.com/ru/post/178665/ Ir kodu piemÄri attiecÄ«bÄ uz migrÄciju un atcelÅ”anas mehÄnismu.
2. Ja sÄkat izmantot migrÄcijas rÄ«kus, neatļaujiet manuÄlas korekcijas datu bÄzes struktÅ«rÄ
KÄ saka: "VienmÄr Persils, vienmÄr Persils." Ja jÅ«su lietojumprogrammas bÄzi sÄk pÄrvaldÄ«t Liquibase, visas manuÄlÄs izmaiÅas nekavÄjoties noved pie nekonsekventa stÄvokļa un izmaiÅu kopu uzticÄ«bas lÄ«menis kļūst nulle. IespÄjamie riski ietver vairÄkas stundas, kas pavadÄ«tas, atjaunojot datubÄzi; sliktÄkajÄ gadÄ«jumÄ - miris serveris. Ja jÅ«su komandÄ ir āvecÄs skolasā DBA arhitekts, pacietÄ«gi un pÄrdomÄti paskaidrojiet viÅam, cik slikti bÅ«s, ja viÅÅ” vienkÄrÅ”i rediÄ£Äs datubÄzi atbilstoÅ”i savai izpratnei no nosacÄ«tÄ SQL izstrÄdÄtÄja.
3. Ja izmaiÅu kopa jau ir ievietota repozitorijÄ, izvairieties no rediÄ£ÄÅ”anas
Ja kÄds cits izstrÄdÄtÄjs veica vilkÅ”anu un pielietoja izmaiÅu kopu, kas vÄlÄk tiks rediÄ£Äta, viÅÅ” noteikti atcerÄsies jÅ«s ar labu vÄrdu, kad saÅems kļūdu, startÄjot programmu. Ja izmaiÅu kopas rediÄ£ÄÅ”ana kaut kÄdÄ veidÄ nonÄk attÄ«stÄ«bÄ, jums bÅ«s jÄseko labojumfailu slidenajai nogÄzei. ProblÄmas bÅ«tÄ«ba balstÄs uz izmaiÅu validÄciju ar hash summu - galveno Liquibase mehÄnismu. RediÄ£Äjot izmaiÅu kopas kodu, mainÄs jaukÅ”anas apjoms. IzmaiÅu kopu rediÄ£ÄÅ”ana ir iespÄjama tikai tad, ja ir iespÄjams izvietot visu datu bÄzi no nulles, nezaudÄjot datus. Å ajÄ gadÄ«jumÄ SQL vai XML koda pÄrstrukturÄÅ”ana var, gluži pretÄji, atvieglot dzÄ«vi un padarÄ«t migrÄcijas lasÄmÄkas. PiemÄrs varÄtu bÅ«t situÄcija, kad lietojumprogrammas sÄkumÄ komandas ietvaros tika saskaÅota avota datu bÄzes shÄma.
4. Ja iespÄjams, pÄrbaudiet datu bÄzes dublÄjumus
Å eit, manuprÄt, viss ir skaidrs. Ja pÄkÅ”Åi migrÄcija bija neveiksmÄ«ga, visu var atgriezt atpakaļ. Liquibase ir rÄ«ks izmaiÅu atgrieÅ”anai, taÄu arÄ« atcelÅ”anas skriptus raksta pats izstrÄdÄtÄjs, un tiem var rasties problÄmas ar tÄdu paÅ”u varbÅ«tÄ«bu kÄ galvenÄs izmaiÅu kopas skriptiem. Tas nozÄ«mÄ, ka jebkurÄ gadÄ«jumÄ ir lietderÄ«gi droÅ”i spÄlÄt ar dublÄjumkopijÄm.
5. Ja iespÄjams, izstrÄdÄ izmantojiet pÄrbaudÄ«tas datu bÄzes dublÄjumkopijas
Ja tas nav pretrunÄ ar lÄ«gumiem un privÄtumu, datu bÄzÄ nav personas datu, un tas nesver tik daudz kÄ divas saules - pirms to izmantoÅ”anas tieÅ”raides migrÄcijas serveros varat pÄrbaudÄ«t, kÄ tas darbosies izstrÄdÄtÄja maŔīnÄ un aprÄÄ·inÄt gandrÄ«z 100% iespÄjamo problÄmu migrÄcijas laikÄ.
6. Sazinieties ar citiem komandas izstrÄdÄtÄjiem
Labi organizÄtÄ attÄ«stÄ«bas procesÄ visi komandÄ zina, kas ko dara. ReÄli tas tÄ bieži nenotiek, tÄdÄļ, ja sava uzdevuma ietvaros gatavojat izmaiÅas datu bÄzes struktÅ«rÄ, ieteicams par to papildus informÄt visu komandu. Ja kÄds paralÄli veic izmaiÅas, jums rÅ«pÄ«gi jÄorganizÄ. Ir vÄrts sazinÄties ar kolÄÄ£iem pÄc darba pabeigÅ”anas, ne tikai sÄkumÄ. Daudzas iespÄjamÄs problÄmas ar izmaiÅu kopÄm var atrisinÄt koda pÄrskatÄ«Å”anas posmÄ.
7. PadomÄ, ko dari!
Å Ä·iet, ka tas ir paÅ”saprotams padoms, kas attiecas uz jebkuru situÄciju. TomÄr no daudzÄm problÄmÄm varÄja izvairÄ«ties, ja izstrÄdÄtÄjs bÅ«tu vÄlreiz analizÄjis, ko viÅÅ” dara un ko tas varÄtu ietekmÄt. Darbs ar migrÄcijÄm vienmÄr prasa papildu uzmanÄ«bu un precizitÄti.
Slazdi
Tagad apskatÄ«sim tipiskos slazdus, āākuros varat iekrist, ja neievÄrosiet iepriekÅ” minÄtos ieteikumus, un kas tieÅ”i jums bÅ«tu jÄdara?
1. situÄcija: divi izstrÄdÄtÄji vienlaikus mÄÄ£ina pievienot jaunas izmaiÅu kopas
Vasja un Petja vÄlas izveidot izmaiÅu kopas 4. versiju, nezinot viens par otru. ViÅi veica izmaiÅas datu bÄzes struktÅ«rÄ un izdeva izvilkÅ”anas pieprasÄ«jumu ar dažÄdiem izmaiÅu kopas failiem. Tiek piedÄvÄts Å”Äds darbÄ«bas mehÄnisms:
KÄ atrisinÄt
KolÄÄ£iem kaut kÄ jÄvienojas, kÄdÄ secÄ«bÄ jÄiet viÅu izmaiÅu kopas, piemÄram, vispirms jÄpiemÄro Petins.
KÄdam vajadzÄtu pievienot sev otro un atzÄ«mÄt Vasjas izmaiÅu kopu ar versiju 5. To var izdarÄ«t, izmantojot Cherry Pick vai glÄ«tu sapludinÄÅ”anu.
PÄc izmaiÅÄm noteikti jÄpÄrbauda veikto darbÄ«bu pamatotÄ«ba.
Faktiski Liquibase mehÄnismi ļaus jums repozitorijÄ izveidot divas 4. versijas izmaiÅu kopas, lai jÅ«s varÄtu atstÄt visu kÄ ir. Tas nozÄ«mÄ, ka jums vienkÄrÅ”i bÅ«s divas izmaiÅas 4. versijÄ ar dažÄdiem nosaukumiem. Izmantojot Å”o pieeju, vÄlÄk kļūst ļoti grÅ«ti orientÄties datu bÄzes versijÄs.
TurklÄt Liquibase, tÄpat kÄ hobitu mÄjvieta, glabÄ daudz noslÄpumu. Viena no tÄm ir validCheckSum atslÄga, kas parÄdÄ«jÄs 1.7 versijÄ un ļauj norÄdÄ«t derÄ«gu jaucÄjvÄrtÄ«bu konkrÄtai izmaiÅu kopai neatkarÄ«gi no datubÄzÄ saglabÄtÄ. DokumentÄcija https://www.liquibase.org/documentation/changeset.html saka sekojoÅ”o:
Pievienojiet kontrolsummu, kas tiek uzskatÄ«ta par derÄ«gu Å”ai izmaiÅu kopai neatkarÄ«gi no datu bÄzÄ saglabÄtÄ. Izmanto galvenokÄrt tad, kad jÄmaina ChangeSet un nevÄlaties, lai kļūdas tiktu parÄdÄ«tas datu bÄzÄs, kurÄs tas jau ir palaists (nav ieteicama procedÅ«ra).
JÄ, jÄ, Ŕī procedÅ«ra nav ieteicama. Bet dažreiz spÄcÄ«gs gaismas burvis pÄrvalda arÄ« tumÅ”Äs tehnikas
2. situÄcija: migrÄcija, kas ir atkarÄ«ga no datiem
PieÅemsim, ka jums nav iespÄjas izmantot datu bÄzes dublÄjumus no tieÅ”ajiem serveriem. Petja izveidoja izmaiÅu kopu, pÄrbaudÄ«ja to lokÄli un, bÅ«dams pilnÄ«bÄ pÄrliecinÄts, ka viÅam ir taisnÄ«ba, iesniedza izstrÄdÄtÄjam izvilkÅ”anas pieprasÄ«jumu. Katram gadÄ«jumam projekta vadÄ«tÄjs noskaidroja, vai Petja to ir pÄrbaudÄ«jis, un pÄc tam pievienoja. TaÄu izvietoÅ”ana izstrÄdes serverÄ« samazinÄjÄs.
PatiesÄ«bÄ tas ir iespÄjams, un neviens nav pasargÄts no tÄ. Tas notiek, ja tabulas struktÅ«ras izmaiÅas ir kaut kÄdÄ veidÄ saistÄ«tas ar konkrÄtiem datiem no datu bÄzes. AcÄ«mredzot, ja Petjas datu bÄze ir aizpildÄ«ta tikai ar testa datiem, tÄ var neaptvert visus problÄmu gadÄ«jumus. PiemÄram, dzÄÅ”ot tabulu, izrÄdÄs, ka citÄs tabulÄs pÄc ÄrÄjÄs atslÄgas ir ieraksti, kas ir saistÄ«ti ar ierakstiem tajÄ, kas tiek dzÄsta. Vai arÄ« mainot kolonnas veidu, izrÄdÄs, ka ne 100% datu var konvertÄt uz jauno tipu.
KÄ atrisinÄt
Uzrakstiet Ä«paÅ”us skriptus, kas tiks izmantoti vienreiz kopÄ ar migrÄciju, un izveidojiet datus pareizajÄ formÄ. Å is ir vispÄrÄ«gs veids, kÄ atrisinÄt datu pÄrsÅ«tÄ«Å”anas uz jaunÄm struktÅ«rÄm problÄmu pÄc migrÄcijas piemÄroÅ”anas, taÄu kaut ko lÄ«dzÄ«gu var izmantot arÄ« iepriekÅ”, Ä«paÅ”os gadÄ«jumos. Å is ceļŔ, protams, ne vienmÄr ir pieejams, jo datu rediÄ£ÄÅ”ana tieÅ”raides serveros var bÅ«t bÄ«stama un pat postoÅ”a.
VÄl viens sarežģīts veids ir rediÄ£Ät esoÅ”u izmaiÅu kopu. GrÅ«tÄ«bas ir tÄdas, ka bÅ«s jÄatjauno visas datu bÄzes, kurÄs tas jau ir lietots esoÅ”ajÄ formÄ. PilnÄ«gi iespÄjams, ka visa aizmugursistÄmas komanda bÅ«s spiesta lokÄli izvÄrst datubÄzi no nulles.
Un universÄlÄkais veids ir datu problÄmas pÄrsÅ«tÄ«Å”ana uz izstrÄdÄtÄja vidi, atkÄrtoti izveidojot to paÅ”u situÄciju un bojÄtajai pievienojot jaunu izmaiÅu kopu, kas apies problÄmu.
KopumÄ, jo vairÄk datu bÄzes sastÄvs ir lÄ«dzÄ«gÄks ražoÅ”anas servera datu bÄzei, jo mazÄka iespÄja, ka problÄmas ar migrÄciju nonÄks tÄlu. Un, protams, pirms izmaiÅu kopas nosÅ«tÄ«Å”anas uz repozitoriju, vairÄkas reizes jÄpadomÄ, vai tÄ kaut ko nesabojÄs.
SituÄcija 3. Liquibase sÄk lietot pÄc tam, kad tÄ nonÄk ražoÅ”anÄ
PieÅemsim, ka komandas vadÄ«tÄjs lÅ«dza Petju iekļaut projektÄ Liquibase, taÄu projekts jau tiek ražots un ir esoÅ”a datu bÄzes struktÅ«ra.
AttiecÄ«gi problÄma ir tÄ, ka visos jaunos serveros vai izstrÄdÄtÄju maŔīnÄs Ŕīs tabulas ir jÄizveido no jauna, un esoÅ”ajai videi jÄpaliek konsekventÄ stÄvoklÄ«, kas ir gatavs pieÅemt jaunas izmaiÅu kopas.
KÄ atrisinÄt
Ir arÄ« vairÄki veidi:
Pirmais un acÄ«mredzamÄkais ir atseviŔķs skripts, kas jÄpielieto manuÄli, inicializÄjot jaunu vidi.
Otrais ir mazÄk acÄ«mredzams, izmantojiet Liquibase migrÄciju, kas atrodas citÄ Liquibase kontekstÄ, un lietojiet to. VairÄk par Liquibase Context varat lasÄ«t Å”eit: https://www.liquibase.org/documentation/contexts.html. KopumÄ tas ir interesants mehÄnisms, ko var veiksmÄ«gi izmantot, piemÄram, testÄÅ”anai.
TreÅ”ais ceļŔ sastÄv no vairÄkiem soļiem. PirmkÄrt, ir jÄizveido migrÄcija esoÅ”ajÄm tabulÄm. Tad tas ir jÄpiemÄro kÄdai videi un tÄdÄjÄdi tiks iegÅ«ta tÄs jaucÄjsumma. NÄkamais solis ir inicializÄt tukÅ”as Liquibase tabulas mÅ«su netukÅ”Ä serverÄ«, un tabulÄ ar izmaiÅu kopu izmantoÅ”anas vÄsturi varat manuÄli ievietot ierakstu par izmaiÅu kopu āit kÄ lietotuā ar izmaiÅÄm, kas jau ir datu bÄzÄ. . TÄdÄjÄdi esoÅ”ajÄ serverÄ« vÄstures atpakaļskaitÄ«Å”ana sÄksies no 2. versijas, un visas jaunÄs vides darbosies identiski.
SituÄcija 4. MigrÄcijas kļūst milzÄ«gas, un tÄm nav laika pabeigt
Pakalpojuma izstrÄdes sÄkumÄ Liquibase parasti tiek izmantota kÄ ÄrÄja atkarÄ«ba, un visas migrÄcijas tiek apstrÄdÄtas lietojumprogrammas startÄÅ”anas brÄ«dÄ«. TomÄr laika gaitÄ jÅ«s varat paklupt uz Å”Ädiem gadÄ«jumiem:
MigrÄcijas kļūst milzÄ«gas, un to pabeigÅ”ana prasa ilgu laiku.
Ir nepiecieÅ”ama migrÄcija sadalÄ«tÄs vidÄs, piemÄram, vairÄkos datu bÄzes servera gadÄ«jumos vienlaikus.
TÄdÄ gadÄ«jumÄ, piemÄrojot migrÄciju pÄrÄk ilgi, lietojumprogrammas startÄÅ”anas laikÄ iestÄsies taimauts. TurklÄt, piemÄrojot migrÄciju katrai lietojumprogrammas gadÄ«jumam atseviŔķi, dažÄdi serveri var bÅ«t nesinhronizÄti.
KÄ atrisinÄt
Å Ädos gadÄ«jumos jÅ«su projekts jau ir liels, iespÄjams, pat pieauguÅ”ais, un Liquibase sÄk darboties kÄ atseviŔķs ÄrÄjs rÄ«ks. Fakts ir tÄds, ka Liquibase kÄ bibliotÄka tiek apkopota jar failÄ un var darboties kÄ atkarÄ«ba projekta ietvaros vai neatkarÄ«gi.
AtseviÅ”Ä·Ä režīmÄ migrÄcijas ievieÅ”anu varat atstÄt savas CI/CD vides vai sistÄmas administratoru un izvietoÅ”anas speciÄlistu spÄcÄ«go pleciem. Lai to izdarÄ«tu, jums bÅ«s nepiecieÅ”ama Liquibase komandrinda https://www.liquibase.org/documentation/command_line.html. Å ajÄ režīmÄ lietojumprogrammu kļūst iespÄjams palaist pÄc tam, kad ir veiktas visas nepiecieÅ”amÄs migrÄcijas.
secinÄjums
PatiesÄ«bÄ, strÄdÄjot ar datu bÄzu migrÄÅ”anu, var bÅ«t daudz vairÄk kļūmju, un daudzÄm no tÄm ir nepiecieÅ”ama radoÅ”a pieeja. Ir svarÄ«gi saprast, ka, pareizi izmantojot rÄ«ku, lielÄko daļu no Ŕīm nepilnÄ«bÄm var izvairÄ«ties. KonkrÄti, man bija jÄrisina visas uzskaitÄ«tÄs problÄmas dažÄdÄs formÄs, un dažas no tÄm bija manu kļūdu rezultÄts. PÄrsvarÄ tas notiek, protams, neuzmanÄ«bas dÄļ, bet dažreiz arÄ« noziedzÄ«gas nespÄjas izmantot rÄ«ku.