{"id":70973,"date":"2020-02-23T00:58:26","date_gmt":"2020-02-22T21:58:26","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase"},"modified":"2020-03-03T16:14:41","modified_gmt":"2020-03-03T13:14:41","slug":"kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","title":{"rendered":"Kuidas mitte endale jalga tulistada, kasutades Liquibase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Kunagi ei ole olnud, ja n\u00fc\u00fcd j\u00e4lle!<\/p>\n<p><\/p>\n<p>Uuel projektil otsustasime alustada Liquibase'i kasutamist, et tulevikus probleeme v\u00e4ltida. Selgus, et mitte k\u00f5ik noored meeskonnaliikmed ei oska seda \u00f5igesti kasutada. Ma korraldasin sisemise t\u00f6\u00f6tuba, mille otsustasin hiljem artikliks \u00fcmber kirjutada. <\/p>\n<p><\/p>\n<p>Artikkel sisaldab kasulikke n\u00e4pun\u00e4iteid ja kirjeldust kolmest k\u00f5ige silmatorkavamast l\u00f5ksust, millesse v\u00f5ib sattuda, t\u00f6\u00f6tades relatsiooniliste andmebaaside migreerimise t\u00f6\u00f6riistadega, sealhulgas Liquibase'iga. Suunatud Java arendajatele tasemel Junior ja Middle, v\u00f5ivad kogenumad arendajad leida seda huvitavaks struktuuri ja korduse m\u00f5ttes, mis on t\u00f5en\u00e4oliselt juba tuttav. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kuidas mitte endale jalga tulistada, kasutades Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/f8b3c9a456bde7aa123702fae132b4b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Liquibase ja Flyway on peamised konkureerivad tehnoloogiad relatsiooniliste struktuuride versioonihalduse probleemide lahendamiseks Java maailmas. Esimene on t\u00e4iesti tasuta ja seda valitakse praktikas sagedamini, seet\u00f5ttu on Liquibase valitud selle v\u00e4ljaande peategelaseks. Siiski v\u00f5ivad m\u00f5ned kirjeldatud praktikad olla universaalsed, s\u00f5ltuvalt teie rakenduse arhitektuurist. <\/p>\n<p><\/p>\n<p>Relaatsioonistruktuuride migreerimine on sunnitud meetod, et v\u00f5idelda relatsiooniliste andmehoidlate madala paindlikkuse vastu. OOP ajastul eeldas andmebaaside kasutamine, et me kirjeldame skeemi \u00fcks kord ja ei puutu sellesse enam. Kuid reaalsus on alati selline, et k\u00f5ik muutub, ning tabelite struktuuris on muutused piisavalt tihti vajalikud. Loomulikult on see protsess sageli valulik ja ebameeldiv. <\/p>\n<p><\/p>\n<p>Ei hakka s\u00fcvenema tehnoloogia ja juhiste kirjeldamisse, kuidas biblioteeki oma projektis kasutada; selle teema kohta on juba piisavalt artikleid kirjutatud:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460377\/\">Liquibase kasutamine andmebaasi struktuuri haldamiseks Spring Boot rakenduses. Osa 1<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460907\/\">Liquibase kasutamine andmebaasi struktuuri haldamiseks Spring Boot rakenduses. Osa 2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436994\/\">Liquibase ja Maven<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/330662\/\">Andmebaasi muudatuste versioonimistaktikad<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/271719\/\">Spring MVC\/Security, REST, Hibernate ja Liquibase k\u00e4ivitame kahe k\u00e4suga<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Lisaks on juba olnud suurep\u00e4rane artikkel kasulike n\u00f5uannete teemal:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/179425\/\">Liquibase kasutamine ilma peavaludeta. 10 n\u00f5uannet reaalsest arenduskogemusest<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sovety\">N\u00f5uanded<\/h2>\n<p><\/p>\n<p>Soovin jagada oma n\u00f5uandeid ja kommentaare, mis on s\u00fcndinud probleemide lahendamise kaudu, mis on seotud migreerimisega, verd, higi ja valu.<\/p>\n<p><\/p>\n<h3 id=\"1--pered-rabotoy-sleduet-oznakomitsya-s-razdelom-luchshih-praktik-na-saytehttpswwwliquibaseorgbestpracticeshtml-liquibase\">1. Enne t\u00f6\u00f6 alustamist tutvuge parimate praktikate jaotisega aadressil <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">veebilehel<\/a><\/noindex> Liquibase<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">Seal<\/a><\/noindex> on kirjeldatud lihtsaid, kuid v\u00e4ga olulisi asju, ilma milleta raamatukogu kasutamine v\u00f5ib teile elu keerulisemaks muuta. N\u00e4iteks struktuuri mittes\u00fcsteemne l\u00e4henemine muudetud kogumite haldamisele toob varem v\u00f5i hiljem segadust ja katkenud migratsioone. Kui s\u00f5ltuvad andmebaasi struktuuri ja teenuste loogika muutused ei toimu samaaegselt, on suur t\u00f5en\u00e4osus, et see toob kaasa punased testid v\u00f5i rikutud keskkonna. Lisaks sisaldavad Liquibase'i kasutamise soovitused ametlikul saidil punkti rollback skriptide v\u00e4ljat\u00f6\u00f6tamise ja kontrollimise kohta koos p\u00f5hiskriptidega migratsiooniks. Ja artiklis <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/178665\/\">https:\/\/habr.com\/ru\/post\/178665\/<\/a><\/noindex> on n\u00e4ited koodist, mis puudutavad migratsioone ja rollback mehhanismi. <\/p>\n<p><\/p>\n<h3 id=\"2-esli-nachali-ispolzovat-sredstva-migracii--ne-dopuskayte-manualnyh-ispravleniy-v-strukture-bazy\">2. Kui olete hakanud kasutama migratsiooni t\u00f6\u00f6riistu, v\u00e4ltige k\u00e4sitsi parandusi andmebaasi struktuuris.<\/h3>\n<p><\/p>\n<p>Nagu \u00f6eldakse: \"\u00dcks kord Persil \u2014 alati Persil\". Kui teie rakenduse andmebaasi hakkab haldama Liquibase, siis igasugune k\u00e4sitsi muudatus toob koheselt kaasa j\u00e4rjepidevuse rikkumise ning muudatuste usaldusv\u00e4\u00e4rsus langeb nulli. Potentsiaalne oht on mitu tundi, mis kulub andmebaasi taastamiseks, halvemal juhul \u2014 serveri rike. Kui teie meeskonnas on \u201evana kooli\u201c DBA arhitekt, siis selgitage talumatult ja p\u00f5hjalikult, kui halvasti l\u00e4heb, kui ta lihtsalt toimetab andmebaasi oma \u00e4ran\u00e4gemise j\u00e4rgi, kasutades navigeeritavat SQL arendajat. <\/p>\n<p><\/p>\n<h3 id=\"3-esli-chendzhset-uzhe-byl-zapushen-v-repozitoriy-izbegayte-redaktirovaniya\">3. Kui muudatuskomplekt on juba hoidlasse pushitud, v\u00e4ltige redigeerimist<\/h3>\n<p><\/p>\n<p>Kui m\u00f5ni teine arendaja teeb pull'i ja rakendab muutuste komplekti, mida hiljem muudetakse, siis kindlasti meenutab ta sind head s\u00f5naga, kui ta saab rakenduse k\u00e4ivitamisel vea. Kui muutuste komplekti muutmine j\u00f5uab kuidagi arendusse, tuleb minna libedale teele kiirparanduste tegemiseks. Probleemi olemus seisneb muudatuste valideerimise kontrollimises rakendades hash-summat \u2014 see on Liquibase'i peamine mehhanism. Muutuste komplekti koodi muutmisel muutub hash-summa. Muutuste komplekti redigeerimine on v\u00f5imalik ainult siis, kui on olemas v\u00f5imalus ilma andmete kaota, k\u00e4ivitada kogu andmebaas nullist. Sellisel juhul v\u00f5ib SQL-i v\u00f5i XML-i koodi refaktoreerimine vastupidi elu lihtsamaks teha, muutes migreerimised loetavamaks. N\u00e4iteks v\u00f5ib v\u00e4lja tuua olukorra, kus rakenduse k\u00e4ivitamisel oli algse andmebaasi skeem meeskonnas koosk\u00f5lastatud. <\/p>\n<p><\/p>\n<h3 id=\"4--imey-proverennye-bekapy-baz-dannyh-esli-eto-vozmozhno\">4. Hoia kontrollitud andmebaasi varukoopiaid, kui see on v\u00f5imalik<\/h3>\n<p><\/p>\n<p>Siin on k\u00f5ik selge. Kui migratsioon peaks eba\u00f5nnestuma, saab k\u00f5ik alati tagasi p\u00f6\u00f6rata. Liquibase'il on muudatuste tagasis\u00f6\u00f6te t\u00f6\u00f6riist, kuid tagasip\u00f6\u00f6rdumisskriptid kirjutab samuti arendaja ning nendes v\u00f5ivad esineda probleemid sama t\u00f5en\u00e4osusega kui p\u00f5hichanget set'i skriptides. See t\u00e4hendab, et varukoopiate tegemine on kasulik igal juhul. <\/p>\n<p><\/p>\n<h3 id=\"5-ispolzuy-proverennye-bekapy-baz-dannyh-v-razrabotke-esli-eto-vozmozhno\">5. Kasuta arenduses usaldusv\u00e4\u00e4rseid andmebaasi varukoopiaid, kui see on v\u00f5imalik.<\/h3>\n<p><\/p>\n<p>Kui see ei ole lepingutega ja privaatsusega vastuolus, andmebaasis ei ole isikuandmeid ning see ei kaalu nagu kaks p\u00e4ikest \u2014 enne eluserveritel migratsiooni rakendamist saab kontrollida, kuidas see arendaja masinas t\u00f6\u00f6tab, ja tuvastada peaaegu 100% potentsiaalsed probleemid migratsiooni ajal. <\/p>\n<p><\/p>\n<h3 id=\"6-obschaysya-s-drugimi-razrabotchikami-v-komande\">6. Suhtle meeskonna teiste arendajatega.<\/h3>\n<p><\/p>\n<p>Korrektselt korraldatud arendusprotsessis teavad k\u00f5ik meeskonnas, kes millega tegeleb. Kuid reaalsuses pole see sageli nii, seet\u00f5ttu, kui oma \u00fclesande raames valmistad ette muudatusi andmebaasi struktuuris, on soovitatav teavitada sellest kogu meeskonda. Kui keegi teeb muudatusi samal ajal \u2014 tuleks ettevaatlikult korraldada. Kolleegidega tasub suhelda ka p\u00e4rast t\u00f6\u00f6 valmimist, mitte ainult alguses. Paljusid potentsiaalseid probleeme chengset'idega saab lahendada code review etapis. <\/p>\n<p><\/p>\n<h3 id=\"7-dumay-chto-delaesh\">7. M\u00f5tle, mida teed!<\/h3>\n<p><\/p>\n<p>Tundub iseenesestm\u00f5istetav soovitus, mis kehtib igas olukorras. Siiski oleks paljusid probleeme saanud v\u00e4ltida, kui arendaja oleks veel kord anal\u00fc\u00fcsinud, mida ta teeb ja millist m\u00f5ju see v\u00f5ib avaldada. Migratsioonide t\u00f6\u00f6tlemine n\u00f5uab alati t\u00e4iendavat t\u00e4helepanu ja hoolikust. <\/p>\n<p><\/p>\n<h2 id=\"lovushki\">K\u00fc\u00fcnesed<\/h2>\n<p><\/p>\n<p>Vaatame n\u00fc\u00fcd t\u00fc\u00fcpilisi k\u00fc\u00fcsi, kuhu v\u00f5ite sattuda, kui ei j\u00e4rgita \u00fclaltoodud soovitusi, ja mida tegelikult teha?<\/p>\n<p><\/p>\n<h3 id=\"situaciya-1-dva-razrabotchika-pytayutsya-odnovremenno-dobavlyat-novye-chendzhsety\">Situatsioon 1. Kaks arendajat p\u00fc\u00fcavad samal ajal uusi chengset'e lisada<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kuidas mitte endale jalga tulistada, kasutades Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/20706fc970510bc06634fa001a4c7ceb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVassil ja Petja soovivad luua versiooni 4 muudatusetappide komplekti, teadmata \u00fcksteisest. Nad on teinud muudatusi andmebaasi struktuuris ja esitanud pull requesti erinevate muudatusfailidega. J\u00e4rgmine tegevusmehhanism on nagu j\u00e4rgmine:<\/p>\n<p><\/p>\n<h4 id=\"kak-reshat\">Kuidas lahendada<\/h4>\n<p><\/p>\n<ol>\n<li>Kolleegid peavad kuidagi kokku leppima, millises j\u00e4rjekorras nende muudatusetapid peaksid k\u00e4ima, h\u00fcpoteetiliselt peaks Petja muudatus olema esimesena kasutusele v\u00f5etud. <\/li>\n<li>Keegi peab oma muudatustele lisama teise ja t\u00e4histama Vassili muudatust versiooniga 5. Seda saab teha kas Cherry Picki v\u00f5i ettevaatliku \u00fchendamise kaudu. <\/li>\n<li>P\u00e4rast muudatusi tuleb kindlasti kontrollida tehtud tegevuste kehtivust.<br \/>\nTegelikult v\u00f5imaldavad Liquibase mehhanismid hoida hoidlas kahte versiooni 4 muudatusetappide komplekti, seega v\u00f5ib k\u00f5ik j\u00e4tta nii, nagu on. Teisis\u00f5nu, teil on lihtsalt kaks versiooni 4 muudatust erinevate nimedega. Sellise l\u00e4henemisega muutub hiljem andmebaasi versioonides navigeerimine v\u00e4ga keeruliseks. <\/li>\n<\/ol>\n<p><\/p>\n<p>Lisaks sellele sisaldab Liquibase, nagu hobbitite kodu, palju saladusi. \u00dcks neist on v\u00f5tme validCheckSum, mis ilmus versiooniga 1.7 ja v\u00f5imaldab m\u00e4\u00e4rata kehtiva hash-summa v\u00e4\u00e4rtuse konkreetse muudatuskomplekti jaoks s\u00f5ltumata sellest, mis andmebaasis talletatakse. Dokumentatsioon <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/changeset.html\">https:\/\/www.liquibase.org\/documentation\/changeset.html<\/a><\/noindex> \u00fctleb j\u00e4rgmist:<\/p>\n<p><\/p>\n<blockquote><p>Lisa kontrollsummat, mis on selle muutuste kogumi jaoks kehtivad, s\u00f5ltumata andmebaasis talletatust. Kasutatakse peamiselt juhul, kui soovite muuta muutuste kogumit ning ei soovi, et andmebaasides, kus see on juba k\u00e4ivitatud, vigu tekitataks (mitte soovitatav protseduur).<\/p><\/blockquote>\n<p>Jah, selline protseduur ei ole soovitatav. Kuid m\u00f5nikord valdab tugev heledaid n\u00f5idu ka tumedaid tehnikaid. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-2-migraciya-kotoraya-zavisit-ot-dannyh\">Situation 2. Migration that depends on data.<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kuidas mitte endale jalga tulistada, kasutades Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/31a6eebb55278c0631115bf16483c7b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oletame, et sul pole v\u00f5imalik kasutada varukoopiaid elavatelt serveritelt. Peeter l\u00f5i muudatuskomplekti, kontrollis seda kohaliku arenduse k\u00e4igus ja tegi t\u00e4ieliku usaldusega pull-requesti dev-keskkonda. Projekti juht k\u00fcsis igaks juhuks, kas Peeter on selle \u00fcle kontrollinud, ja seej\u00e4rel liitis. Kuid juurutamine dev-serveris kukkus l\u00e4bi.<\/p>\n<p><\/p>\n<p>Tegelikult on see v\u00f5imalik ja sellest keegi ei p\u00e4\u00e4se. See juhtub siis, kui tabelite struktuuri muutmine on mingil moel seotud andmetega andmebaasis. On ilmne, et kui Petja andmebaas on t\u00e4idetud ainult testandmetega, siis v\u00f5ib see mitte katta k\u00f5iki probleemseid juhtumeid. N\u00e4iteks, kui tabel kustutatakse, v\u00f5ib selguda, et teistes tabelites on Foreign Key seosed, mis on seotud kustutatavate kirjetega. V\u00f5i kui veeru t\u00fc\u00fcp muutub, v\u00f5ib avastada, et k\u00f5ik andmed ei pruugi uude t\u00fc\u00fcpi konverteeritavad olla. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-1\">Kuidas lahendada<\/h4>\n<p><\/p>\n<ul>\n<li>Kirjutada spetsiaalsed skriptid, mis rakenduvad \u00fchekordselt koos migreerimisega ja viivad andmed n\u00f5utud vormi. See on \u00fcldine tee andmete edastamise probleemide lahendamiseks uutesse struktuuridesse juba p\u00e4rast migreerimiste rakendamist, kuid midagi sellist v\u00f5ib rakendada ka enne, erandlike juhtumite korral. Selline tee ei pruugi siiski alati kergesti k\u00e4tte saada, kuna andmete redigeerimine elus serverites v\u00f5ib olla ohtlik ja isegi hukatuslik. <\/li>\n<li>Teine keeruline tee on redigeerida olemasolevat muudatuskomplekti. Probleem on selles, et k\u00f5ik andmebaasid, kus see olemasolevas vormis juba rakendatud on, tuleb taastada. On t\u00e4iesti v\u00f5imalik, et kogu backend-meeskond peab kohalikult andmebaasi nullist \u00fcles seadma. <\/li>\n<li>Ja k\u00f5ige universaalsem tee on andmeprobleemi \u00fcmber t\u00f5stmine arendaja keskkonda, luues sama olukorra ja lisades uue muudatuskomplekti, kuni katkise, mis v\u00f5imaldab probleemi v\u00e4ltida.<br \/>\n<img decoding=\"async\" alt=\"Kuidas mitte endale jalga tulistada, kasutades Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/b5d28a940a7a35b6cd7a819a8e68f027.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>\u00dcldiselt, mida rohkem andmete koosseis on sarnane tootmisserveri andmebaasile, seda v\u00e4iksem on t\u00f5en\u00e4osus, et migratsiooniprobleemid ulatuvad kaugele. Ja loomulikult, enne kui saadate muudatuskomplekti ladustamisele, tasub paar korda m\u00f5elda, kas see ei riku midagi. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-3-liquibase-nachinaet-primenyatsya-uzhe-posle-vyhoda-v-prodakshn\">Situatsioon 3. Liquibase hakkab rakenduma juba p\u00e4rast tootmisse minekut<\/h3>\n<p><\/p>\n<p>Oletame, et meeskonnajuhataja palus Petjal projektis Liquibase k\u00e4ivitada, kuid projekt on juba tootmises ja olemasolev andmebaasi struktuur on juba olemas.<\/p>\n<p><\/p>\n<p>Seega on probleem selles, et igasugustes uutes serverites v\u00f5i arendajate masinates tuleb nende tabelite andmed luua algusest peale, samas kui juba olemasolev keskkond peab j\u00e4\u00e4ma konsistentseks ja valmis uute muudatuste vastuv\u00f5tmiseks. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-2\">Kuidas lahendada<\/h4>\n<p><\/p>\n<p>Siin on mitmeid l\u00e4henemisviise:<\/p>\n<p><\/p>\n<ul>\n<li>Esimene ja k\u00f5ige ilmsem lahendus on omada eraldi skripti, mida tuleb k\u00e4sitsi rakendada uue keskkonna k\u00e4ivitamisel. <\/li>\n<li>Teine, v\u00e4hem ilmne lahendus, on kasutada Liquibase'i migratsiooni, mis asub teises Liquibase'i kontekstis, ja rakendada seda. Rohkem teavet Liquibase'i konteksti kohta saab lugeda siit: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/contexts.html\">https:\/\/www.liquibase.org\/documentation\/contexts.html<\/a><\/noindex>. \u00dcldiselt on see huvitav mehhanism, mida saab edukalt kasutada n\u00e4iteks testimiseks. <\/li>\n<li>Kolmas tee koosneb mitmest sammust. Esiteks peab olema loodud migreerimine juba olemasolevatele tabelitele. Seej\u00e4rel tuleb see rakendada mingisuguses keskkonnas ja sel moel saadakse selle hash-summa. J\u00e4rgmine samm on alustada meie mitte-t\u00fchjal serveril t\u00fchjade Liquibase tabelite loomist, ja ajalooliste muudatuste tabelisse saab k\u00e4sitsi lisada kirje \"nagu oleks rakendatud\" muudatusest koos juba andmebaasis olemasolevate muudatustega. Nii hakkab ajaloo arvestus olemasoleval serveril minema versioonist 2, samas kui k\u00f5ik uued keskkonnad toimivad samamoodi.<br \/>\n<img decoding=\"async\" alt=\"Kuidas mitte endale jalga tulistada, kasutades Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/78881ee56a6ee3ba4e0cd1089598c3c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"situaciya-4-migracii-stanovyatsya-ogromnymi-i-ne-uspevayut-vypolnyatsya\">Situatsioon 4. Migratsioonid muutuvad tohutuks ja ei j\u00f5ua l\u00e4bi viia<\/h3>\n<p><\/p>\n<p>Teenuse arendamise alguses kasutatakse tavaliselt Liquibase't v\u00e4lise s\u00f5ltuvusena, ja k\u00f5ik migratsioonid t\u00f6\u00f6deldakse rakenduse k\u00e4ivitamisel. Kuid aja jooksul v\u00f5ite kohtuda j\u00e4rgmiste juhtumitega:<\/p>\n<p><\/p>\n<ul>\n<li>Migratsioonid muutuvad tohutuks ja kestavad pikka aega.<\/li>\n<li>Tekkib vajadus migratsiooniks jaotatud keskkondades, n\u00e4iteks samal ajal mitmes andmebaasi serveri instantsis.<br \/>\nSel juhul v\u00f5ib migratsioonide liiga pikaajaline rakendamine viia rakenduse k\u00e4ivitamisel ajutiseks katkestamiseks. Lisaks v\u00f5ib migratsioonide rakendamine iga rakenduse instantsi eraldi p\u00f5hjustada erinevate serverite s\u00fcnkroonimata olekuid. <\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"kak-reshat-3\">Kuidas lahendada<\/h4>\n<p><\/p>\n<p>Sellistes olukordades on teie projekt juba suur, v\u00f5ib-olla isegi t\u00e4iskasvanu eas, ja Liquibase hakkab toimima kui eraldi v\u00e4line t\u00f6\u00f6riist. Asi on selles, et Liquibase koguneb mooduliks jar failiks ning v\u00f5ib t\u00f6\u00f6tada nii s\u00f5ltuvusena projekti sees kui ka iseseisvalt. <\/p>\n<p><\/p>\n<p>Iseseisvas re\u017eiimis saab migratsioonide rakendamise \u00fclesande usaldada teie CI\/CD keskkonnale v\u00f5i teie s\u00fcsteemiadministraatorite kindlatele \u00f5lgadele. Selleks on vajalik Liquibase k\u00e4surea kasutamine <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/command_line.html\">https:\/\/www.liquibase.org\/documentation\/command_line.html<\/a><\/noindex>. Sellises re\u017eiimis on v\u00f5imalus k\u00e4ivitada rakendus juba p\u00e4rast k\u00f5igi vajalike migratsioonide sooritamist.<\/p>\n<p><\/p>\n<h2 id=\"vyvod\">Kokkuv\u00f5te<\/h2>\n<p><\/p>\n<p>Tegelikult v\u00f5ib andmebaasi migratsioonide k\u00e4igus olla palju rohkem l\u00f5kse ja paljusid neist tuleb loominguliselt k\u00e4sitleda. Oluline on m\u00f5ista, et \u00f5ige t\u00f6\u00f6riista kasutamise korral on enamik neist l\u00f5ksudest v\u00e4ltimatud. Ma olen isiklikult kohtunud k\u00f5ikide loetletud probleemidega, m\u00f5ned neist olid ka minu enda eksimuste tagaj\u00e4rg. Peamiselt tekib see loomulikult hooletuse t\u00f5ttu, kuid m\u00f5nel juhul ka t\u00f6\u00f6riista kuritarvitamise t\u00f5ttu.<\/p>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/epam_systems\/blog\/489198\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0435 \u0432\u0441\u0435 \u043c\u043e\u043b\u043e\u0434\u044b\u0435 \u0447\u043b\u0435\u043d\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u043c\u0435\u044e\u0442 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u042f \u043f\u0440\u043e\u0432\u0451\u043b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0432\u043e\u0440\u043a\u0448\u043e\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u044e. \u0421\u0442\u0430\u0442\u044c\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u044f\u0432\u043d\u044b\u0445 \u043b\u043e\u0432\u0443\u0448\u0435\u043a, \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":70974,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-70973","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0435 \u0432\u0441\u0435 \u043c\u043e\u043b\u043e\u0434\u044b\u0435 \u0447\u043b\u0435\u043d\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u043c\u0435\u044e\u0442 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u042f \u043f\u0440\u043e\u0432\u0451\u043b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0432\u043e\u0440\u043a\u0448\u043e\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u044e. \u0421\u0442\u0430\u0442\u044c\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u044f\u0432\u043d\u044b\u0445 \u043b\u043e\u0432\u0443\u0448\u0435\u043a, \u0432\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043d\u0435 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Liquibase | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0435 \u0432\u0441\u0435 \u043c\u043e\u043b\u043e\u0434\u044b\u0435 \u0447\u043b\u0435\u043d\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u043c\u0435\u044e\u0442 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u042f \u043f\u0440\u043e\u0432\u0451\u043b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0432\u043e\u0440\u043a\u0448\u043e\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u044e. \u0421\u0442\u0430\u0442\u044c\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u044f\u0432\u043d\u044b\u0445 \u043b\u043e\u0432\u0443\u0448\u0435\u043a, \u0432\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-22T21:58:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:41+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kuidas mitte endale jalga tulistada, kasutades Liquibase'i | ProHoster","description":"Kunagi ei olnud, ja n\u00fc\u00fcd j\u00e4lle! \u00dchel projektil otsustasime alustada Liquibase'i kasutamist, et tulevikus probleeme v\u00e4ltida. Selgus, et mitte k\u00f5ik meeskonna noored liikmed ei oska seda \u00f5igesti kasutada. Ma korraldasin sisemise t\u00f6\u00f6tuba, mille otsustasin seej\u00e4rel artikliks muuta. Artikkel sisaldab kasulikke n\u00f5uandeid ja kirjeldust kolmest k\u00f5ige silmatorkavamast l\u00f5ksust.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043d\u0435 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Liquibase | ProHoster","og:description":"\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0435 \u0432\u0441\u0435 \u043c\u043e\u043b\u043e\u0434\u044b\u0435 \u0447\u043b\u0435\u043d\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u043c\u0435\u044e\u0442 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u042f \u043f\u0440\u043e\u0432\u0451\u043b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0432\u043e\u0440\u043a\u0448\u043e\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u044e. \u0421\u0442\u0430\u0442\u044c\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u044f\u0432\u043d\u044b\u0445 \u043b\u043e\u0432\u0443\u0448\u0435\u043a, \u0432","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-22T21:58:26+00:00","article:modified_time":"2020-03-03T13:14:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"70973","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:10:24","updated":"2022-09-28 08:39:22"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/70973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=70973"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/70973\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/70974"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=70973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=70973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=70973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}