{"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>Kuni pole kunagi olnud, ja n\u00fc\u00fcd on see j\u00e4lle kohal!<\/p>\n<p><\/p>\n<p>\u00dches meie projektis otsustasime alustada Liquibase'i kasutamist, et v\u00e4ltida tuleviku probleeme. Selgus, et mitte k\u00f5ik noored meeskonnaliikmed ei oska seda \u00f5igesti kasutada. Korraldasin sise-workshop'i, mille otsustasin hiljem artikliks muuta. <\/p>\n<p><\/p>\n<p>Artikkel sisaldab kasulikke n\u00e4pun\u00e4iteid ja kirjeldust kolmest selgest l\u00f5ksust, millesse v\u00f5ib sattuda, t\u00f6\u00f6tades rikka andmebaasi migratsiooni t\u00f6\u00f6riistadega, eesk\u00e4tt Liquibase'iga. Suunatud Java arendajatele, kes on tasemel Junior ja Middle; kogenumate arendajate jaoks v\u00f5ib see olla huvitav struktuuri ja korduse jaoks, mida nad t\u00f5en\u00e4oliselt juba tunnevad. <\/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 konkurentsitehnoloogiad rikka struktuuri versioonihalduse probleemide lahendamiseks Java maailmas. Esimene on t\u00e4ielikult tasuta ja seda valitakse praktikas sagedamini, seet\u00f5ttu on Liquibase valitud selle v\u00e4ljaande kangelaseks. Siiski v\u00f5ivad m\u00f5ned kirjeldatud praktikad olla universaalsed, s\u00f5ltuvalt teie rakenduse arhitektuurist. <\/p>\n<p><\/p>\n<p>Rikka struktuuri migratsioonid on sunnitud meetod, mis aitab v\u00f5idelda rikka andmehoidjate madala paindlikkuse vastu. OOP stiilis eeldas, et me kirjeldame skeemi \u00fche korra ja ei puutu sellesse enam. Kuid reaalsus on alati selline, et k\u00f5ik muutub ja lauatabelite struktuuri muutmise vajadus tekib piisavalt sageli. Loomulikult v\u00f5ib see protsess olla valus ja ebameeldiv. <\/p>\n<p><\/p>\n<p>Ma ei hakka tehnoloogiat s\u00fcvitsi lahkama ega selgitama, kuidas oma projektis raamatukogusid lisada; selle kohta on kirjutatud piisavalt artikleid:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460377\/\">Liquibase'i 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'i 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 versioonimise l\u00e4henemisviisid<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/271719\/\">Startime Spring MVC\/Security, REST, Hibernate, Liquibase kahe k\u00e4suga<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Lisaks on juba olnud suurep\u00e4rane artikkel kasulike n\u00e4pun\u00e4idete teemal:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/179425\/\">Liquibase'i kasutamine ilma peavaludeta. 10 n\u00e4pun\u00e4idet reaalsest arendusest<\/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 vaeva, vere ja valude kaudu migratsiooniprobleemide lahendamisel.<\/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 tuleb tutvuda parimate praktika jaotisega <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">veebisaidil<\/a><\/noindex> Liquibase<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">Seal<\/a><\/noindex> Kirjeldatakse lihtsaid, kuid v\u00e4ga olulisi asju, ilma milleta v\u00f5ib raamatukogu kasutamine muuta teie elu keeruliseks. N\u00e4iteks struktuuri muutuste haldamise struktureerimata l\u00e4henemine toob varem v\u00f5i hiljem kaasa segaduse ja katkenud migratsioonid. Kui andmebaasi struktuuri ja teenuste loogika omavahel s\u00f5ltuvad muudatused ei toimu samal ajal, siis on suur t\u00f5en\u00e4osus, et see toob kaasa punased testid v\u00f5i katkenud keskkonna. Lisaks sisaldavad Liquibase'i ametliku saidi soovitused punkti rollback skriptide arendamise ja testimise kohta koos peamiste migratsiooniskeemidega. Ja artiklis <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/178665\/\">https:\/\/habr.com\/ru\/post\/178665\/<\/a><\/noindex> on koodin\u00e4iteid, mis k\u00e4sitlevad 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 alustanud migratsioonivahendite kasutamist \u2013 \u00e4rge lubage k\u00e4sitsi muudatusi andmebaasi struktuuris.<\/h3>\n<p><\/p>\n<p>Nagu \u00f6eldakse: \"\u00dcks kord Persil \u2013 alati Persil\". Kui teie rakenduse andmebaasi hakkab haldama Liquibase, siis toovad k\u00f5ik k\u00e4sitsi tehtud muudatused kiiresti kaasa mittej\u00e4rjepideva seisundi ja muudatusseente usaldusv\u00e4\u00e4rsus langeb nulli. Potentsiaalsed riskid \u2013 mitu tundi andmebaasi taastamise peale, halvemal juhul \u2013 purustatud server. Kui teie meeskonnas on \"vanakooli\" DBA arhitekt, siis selgitage talle kannatlikult ja hoolikalt, kui halb k\u00f5ik muutub, kui ta lihtsalt muudab andmebaasi oma arusaamise j\u00e4rgi n\u00e4iteks SQL Developeris. <\/p>\n<p><\/p>\n<h3 id=\"3-esli-chendzhset-uzhe-byl-zapushen-v-repozitoriy-izbegayte-redaktirovaniya\">3. Kui muudatusseen on juba repole edastatud, v\u00e4ltige redigeerimist.<\/h3>\n<p><\/p>\n<p>Kui teine arendaja tegi pulli ja rakendas muudatusseente, mida hiljem muudetakse, siis \u00fctleb ta teile kindlasti h\u00e4id s\u00f5nu, kui saab veateate rakenduse k\u00e4ivitamisel. Kui muudatusseene redigeerimine kuidagi lekib arendusse, tuleb minna libedal teel hotfixide suunas. Probleemi sisu p\u00f5hineb muudatuste valideerimisel hash-summa j\u00e4rgi \u2013 Liquibase'i p\u00f5himehhanism. Muudatusseene koodi redigeerimisel muutub hash-summa. Muudatusseene redigeerimine on v\u00f5imalik ainult siis, kui on v\u00f5imalik andmebaasi anda nullist ilma andmeid kaotamata. Sellisel juhul v\u00f5ib SQL v\u00f5i XML koodi refaktoorimine vastupidi elu lihtsamaks teha ja muudatused arusaadavamaks muuta. N\u00e4iteks v\u00f5ib olukord olla selline, et 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. Omada kontrollitud andmebaasi varukoopiad, kui see on v\u00f5imalik<\/h3>\n<p><\/p>\n<p>Siin on k\u00f5ik arusaadav. Kui migratsioon peaks mingil p\u00f5hjusel eba\u00f5nnestuma, saab k\u00f5ik tagasi tuua. Liquibase'is on muudatuste tagasiv\u00f5tmise t\u00f6\u00f6riist, kuid tagasiv\u00f5tmise skripte kirjutab samuti arendaja, ja nendes v\u00f5ivad olla samasugused probleemid nagu p\u00f5hichangeseti skriptides. See t\u00e4hendab, et varukoopiaid tehes on alati kasulik ettevaatus. <\/p>\n<p><\/p>\n<h3 id=\"5-ispolzuy-proverennye-bekapy-baz-dannyh-v-razrabotke-esli-eto-vozmozhno\">5. Kasuta kontrollitud andmebaasi varukoopiaid arenduses, kui see on v\u00f5imalik<\/h3>\n<p><\/p>\n<p>Kui see ei ole vastuolus lepingute ja privaatsusega, andmebaasis ei ole isikuandmeid ja see ei kaalugi kaks korda rohkem kui kaks p\u00e4ikest \u2014 enne, kui migratsioonid elusserverites rakendatakse, saab kontrollida, kuidas see t\u00f6\u00f6taks arendaja masinal, ja tuvastada peaaegu 100% potentsiaalsest migratsiooniprobleemide hulgast. <\/p>\n<p><\/p>\n<h3 id=\"6-obschaysya-s-drugimi-razrabotchikami-v-komande\">6. Suhtle teiste arendajatega meeskonnas<\/h3>\n<p><\/p>\n<p>Korrektselt korraldatud arendusprotsessis teavad k\u00f5ik meeskonna liikmed, kellel on millised \u00fclesanded. T\u00f5eliselt ei ole sageli nii, seega kui valmistate oma \u00fclesande raames andmebaasi struktuuris muudatusi, on soovitatav teavitada sellest kogu meeskonda. Kui keegi teeb muudatusi paralleelselt \u2014 peaksite ettevaatlikult organiseerima. Koost\u00f6\u00f6listega on oluline suhelda ka p\u00e4rast t\u00f6\u00f6 l\u00f5petamist, mitte ainult alguses. Paljusid potentsiaalseid probleeme chensetitega saab lahendada koodide \u00fclevaatamise etapis. <\/p>\n<p><\/p>\n<h3 id=\"7-dumay-chto-delaesh\">7. M\u00f5tle, mida teed!<\/h3>\n<p><\/p>\n<p>Tundub, et see on ilmne n\u00f5uanne, mis kehtib igas olukorras. Siiski oleks paljusid probleeme saanud v\u00e4ltida, kui arendaja oleks veel kord anal\u00fcsinud, mida ta teeb ja mis sellele v\u00f5ib m\u00f5ju avaldada. T\u00f6\u00f6 migratsioonidega n\u00f5uab alati suuremat t\u00e4helepanu ja hoolikust. <\/p>\n<p><\/p>\n<h2 id=\"lovushki\">L\u00f5ksud<\/h2>\n<p><\/p>\n<p>K\u00e4esolevaga uurime t\u00fc\u00fcpilisi l\u00f5kse, millesse v\u00f5ib sattuda, kui ei j\u00e4rgita \u00fclaltoodud n\u00f5uandeid, ja mis siis t\u00f5eliselt teha.<\/p>\n<p><\/p>\n<h3 id=\"situaciya-1-dva-razrabotchika-pytayutsya-odnovremenno-dobavlyat-novye-chendzhsety\">Situatsioon 1. Kaks arendajat \u00fcritavad samaaegselt lisada uusi changesete<\/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 \/>\nVasya ja Petya soovivad luua changest versiooni 4, teadmata \u00fcksteisest. Nad tegid muudatusi andmebaasi struktuuris ja esitasid pull requesti, erinevate chengeseti failidega. Edasi pakutakse j\u00e4rgmisi meetmeid:<\/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 chengesetid peaksid minema, oletame, et Petja oma peaks olema esimesena. <\/li>\n<li>Keegi peab teise koodiga liitma ja m\u00e4rkima Vaasi muudatuse versiooni 5. Selle saab teha l\u00e4bi Cherry Pick v\u00f5i hoolika merge'i. <\/li>\n<li>P\u00e4rast muudatusi tuleb kindlasti kontrollida tegemiste kehtivust.<br \/>\nTegelikult lubavad Liquibase'i mehhanismid, et hoidlas oleks kaks muudatusetappi versiooniga 4, seega v\u00f5ib k\u00f5ik j\u00e4tta nagu on. See t\u00e4hendab, et teil on lihtsalt kaks muudatust versiooniga 4 erinevate nimedega. Sellise l\u00e4henemisega muutub hiljem andmebaasi versioonide j\u00e4lgimine v\u00e4ga keeruliseks. <\/li>\n<\/ol>\n<p><\/p>\n<p>Lisaks, Liquibase, nagu hobitite kodu, hoiab endas palju saladusi. \u00dcks neist on validCheckSum v\u00f5ti, mis ilmus versiooniga 1.7 ja v\u00f5imaldab m\u00e4\u00e4rata kehtiva r\u00e4sisumma v\u00e4\u00e4rtuse teatud muudatusetappi, s\u00f5ltumata sellest, mis andmebaasis on. 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>Add a checksum that is considered valid for this changeSet, regardless of what is stored in the database. Used primarily when you need to change a changeSet and don&#8217;t want errors thrown on databases on which it has already run (not a recommended procedure)<\/p><\/blockquote>\n<p>Jah, see protseduur ei ole soovitatav. Kuid m\u00f5nikord valdab tugev hele mustkunstnik ka tumedaid tehnikaid <\/p>\n<p><\/p>\n<h3 id=\"situaciya-2-migraciya-kotoraya-zavisit-ot-dannyh\">Situatsioon 2. Migratsioon, mis s\u00f5ltub andmetest<\/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 teil pole v\u00f5imalik kasutada elavate serverite varukoopiaid. Petja l\u00f5i muudatusetapi, kontrollis seda kohalikult ja tegi t\u00e4ie kindlusega oma \u00f5iguses pull request'i arendusserverisse. Projekti juht selgitas igaks juhuks, kas Petja on seda kontrollinud, ja seej\u00e4rel ta sulandas. Kuid arendamine arendusserveris kukkus kokku.<\/p>\n<p><\/p>\n<p>Tegelikult on see v\u00f5imalik ja keegi ei ole sellest kaitstud. See juhtub juhul, kui tabeli struktuuri muudatused on mingil moel seotud konkreetsete andmetega andmebaasist. On ilmne, et kui Petja andmebaas on t\u00e4idetud ainult testandmetega, siis ei pruugi see katta k\u00f5iki probleemseid olukordi. N\u00e4iteks tabeli kustutamisel selgub, et muudes tabelites on andmeid, mis on seotud kustutatavate andmetega Foreign Key kaudu. V\u00f5i kui veeru t\u00fc\u00fcp muutub, selgub, et mitte 100% andmetest ei saa uuele t\u00fc\u00fcbile \u00fcmber muuta. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-1\">Kuidas lahendada<\/h4>\n<p><\/p>\n<ul>\n<li>Kirjutage spetsiaalsed skriptid, mis rakendatakse korra koos migreerimisega ja viivad andmed n\u00f5utud vormi. See on \u00fcldine lahendus andmete \u00fcleviimise probleemile uutesse struktuuridesse p\u00e4rast migratsioonide rakendamist, kuid midagi sarnast v\u00f5ib rakendada ka enne, erijuhtudel. Selline tee ei ole siiski alati kergesti k\u00e4ttesaadav, kuna andmete redigeerimine reaalajas serverites v\u00f5ib olla ohtlik ja isegi hukatuslik. <\/li>\n<li>Teine keeruline tee on olemasoleva muudatuskomplekti redigeerimine. Probleem seisneb selles, et k\u00f5ik andmebaasid, kuhu see praegusel kujul juba rakendati, tuleb taastada. On t\u00e4iesti v\u00f5imalik, et kogu tagasiside meeskond peab kohapeal andmebaasi nullist uuesti rakendama. <\/li>\n<li>Ja k\u00f5ige universaalsem tee on andmeprobleemi \u00fcleviimine arendaja keskkonda, samas luues sama olukorra ja lisades uue muudatuskomplekti, milles on probleem lahendatud.<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 andmebaasi sisu sarnaneb tootmisserveri andmebaasiga, seda v\u00e4iksem on t\u00f5en\u00e4osus, et migratsioonide probleemid probleemid kaugele levivad. Ja loomulikult, enne muudatuskomplekti saatmist hoidlasse tasub mitu korda m\u00f5elda, kas see ei rikuta 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 meeskonna juht palus Petjal liita projekti Liquibase, kuid projekt on juba tootmises ja olemas on juba moodustatud andmebaasi struktuur.<\/p>\n<p><\/p>\n<p>Sellegipoolest seisneb probleem selles, et k\u00f5igil uutel serveritel v\u00f5i arendajate arvutitel peavad andme tabelid olema loodud nullist ning juba olemasolev keskkond peab j\u00e4\u00e4ma j\u00e4rjepidevaks, olles valmis vastu v\u00f5tma uusi muudatuskomplekte. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-2\">Kuidas lahendada<\/h4>\n<p><\/p>\n<p>Siin on samuti mitu teed:<\/p>\n<p><\/p>\n<ul>\n<li>Esimene ja k\u00f5ige ilmsem on kasutada eraldi skripti, mis peab olema k\u00e4sitsi rakendatud uue keskkonna algatamisel. <\/li>\n<li>Teine \u2014 v\u00e4hem ilmne, on omada Liquibase migratsiooni, mis asub teises Liquibase kontekstis ja seda rakendada. T\u00e4iendavat teavet Liquibase konteksti kohta leiate 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 tuleb luua migratsioon juba olemasolevate tabelite jaoks. Seej\u00e4rel peab see olema rakendatud mingis keskkonnas ja nii saadakse selle hash-summa. J\u00e4rgmiseks sammuks on meie mitte t\u00fchi server, kus algatada t\u00fchjad Liquibase tabelid ning ajaloo tabelisse rakendatud muudatuste kohta saab k\u00e4sitsi lisada kirje 'nagu oleks rakendatud' muudatuse kohta juba olemasolevates andmebaasi muudatustes. Nii hakkab ajalugu eksisteerivas serveris versioonist 2 ning k\u00f5ik uued keskkonnad k\u00e4ituvad identiteetselt.<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\">Senaarium 4. Migratsioonid muutuvad tohututeks ja ei j\u00f5ua l\u00f5petada.<\/h3>\n<p><\/p>\n<p>Teenuse arendamise alguses kasutatakse reeglina Liquibase't v\u00e4list s\u00f5ltuvusena ning k\u00f5ik migratsioonid t\u00f6\u00f6deldakse rakenduse k\u00e4ivitamisel. Kuid aja jooksul v\u00f5ite kokku puutuda j\u00e4rgmiste juhtumitega:<\/p>\n<p><\/p>\n<ul>\n<li>Migratsioonid muutuvad tohutuks ja v\u00f5tavad kaua aega.<\/li>\n<li>Tekib vajadus migratsioonide j\u00e4rele jaotatud keskkondades, n\u00e4iteks mitmes andmebaasi serveri instantsis samaaegselt.<br \/>\nSellisel juhul liiga pika migratsiooni rakendamine toob kaasa rakenduse k\u00e4ivitamisel aegumise. Lisaks v\u00f5ivad migratsioonide rakendamine iga rakenduse instantsi jaoks eraldi viia olukorrani, kus erinevad serverid on s\u00fcnkroonitud olekusse. <\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"kak-reshat-3\">Kuidas lahendada<\/h4>\n<p><\/p>\n<p>Sellistes juhtumites on teie projekt juba suur, v\u00f5ib-olla lausa t\u00e4iskasvanud, ja Liquibase hakkab toimima kui eraldi v\u00e4line t\u00f6\u00f6riist. Asi on selles, et Liquibase kogutakse jar-failiks ja see v\u00f5ib t\u00f6\u00f6tada kas s\u00f5ltuvusena projektis v\u00f5i iseseisvalt. <\/p>\n<p><\/p>\n<p>Iseseisvas re\u017eiimis on v\u00f5imalik migratsioonide rakendamine j\u00e4tta teie CI\/CD keskkonna v\u00f5i tugevate s\u00fcsteemihaldurite \u00f5lgadele. Selleks on vajalik Liquibase k\u00e4surea t\u00f6\u00f6riist. <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\u00f5imalik rakendust k\u00e4ivitada alles p\u00e4rast seda, kui k\u00f5ik vajalikud migratsioonid on l\u00e4bi viidud.<\/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, millest paljusid tuleb l\u00e4heneda loominguliselt. On oluline m\u00f5ista, et kui t\u00f6\u00f6riista \u00f5igesti kasutada, siis saab enamik neist l\u00f5ksudest v\u00e4ltida. Isiklikult olen ma erinevates vormides kokku puutunud k\u00f5igi nimetatud probleemidega, ja m\u00f5ned nendest tulid minu enda vigadest. Peamiselt juhtub see t\u00e4helepanematuse t\u00f5ttu, kuid m\u00f5nikord \u2013 kuritegeliku oskamise t\u00f5ttu t\u00f6\u00f6riista kasutamisel.<\/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 5.0.1.1 - 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.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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 endale Liquibase'i kasutamisel jalga p\u00fcsti lasta | ProHoster","description":"Kunagi ei ole olnud, ja j\u00e4lle on see juhtunud! \u00dchel projektil otsustasime alustada Liquibase'i kasutamist, et tulevikus probleeme v\u00e4ltida.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}