{"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\/ro\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","title":{"rendered":"Cum s\u0103 nu te \u00eempu\u0219ti \u00een picior folosind Liquibase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Niciodat\u0103 nu a fost, \u0219i iat\u0103 c\u0103 din nou!<\/p>\n<p><\/p>\n<p>\u00cen cadrul unui nou proiect, am decis s\u0103 folosim Liquibase de la \u00eenceput, pentru a evita problemele \u00een viitor. A\u0219a cum s-a dovedit, nu to\u021bi membrii tineri ai echipei \u0219tiu cum s\u0103-l foloseasc\u0103 corect. Am organizat un workshop intern, pe care ulterior am decis s\u0103-l transform \u00eentr-un articol. <\/p>\n<p><\/p>\n<p>Articolul include sfaturi utile \u0219i descrierea celor trei capcane evidente \u00een care se poate c\u0103dea lucr\u00e2nd cu instrumentele de migrare a bazelor de date rela\u021bionale, \u00een special Liquibase. Este destinat dezvoltatorilor Java de nivel Junior \u0219i Middle; pentru dezvoltatorii mai experimenta\u021bi, poate fi interesant pentru structurarea \u0219i revizuirea a ceea ce, cel mai probabil, le este deja cunoscut. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cum s\u0103 nu te \u00eempu\u0219ti \u00een picior folosind 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 \u0219i Flyway sunt principalele tehnologii concurente pentru gestionarea versiunilor structurilor rela\u021bionale \u00een lumea Java. Prima este complet gratuit\u0103 \u0219i, \u00een practic\u0103, este aleas\u0103 mai des pentru utilizare, de aceea Liquibase a fost ales ca erou al publica\u021biei. Cu toate acestea, unele dintre practicile descrise pot fi universale, \u00een func\u021bie de arhitectura aplica\u021biei dumneavoastr\u0103. <\/p>\n<p><\/p>\n<p>Migrarea structurilor rela\u021bionale este o metod\u0103 ap\u0103rut\u0103 din necesitate pentru a combate rigiditatea sc\u0103zut\u0103 a bazelor de date rela\u021bionale. \u00cen epoca \u00een care OOP era la mod\u0103, stilul de lucru cu baza de date presupunea c\u0103 descriem o dat\u0103 schema \u0219i nu o vom mai modifica. Dar realitatea este c\u0103 totul se schimb\u0103, iar modific\u0103rile structurii tabelului sunt necesare destul de frecvent. Evident, procesul \u00een sine poate fi dureros \u0219i nepl\u0103cut. <\/p>\n<p><\/p>\n<p>Nu voi aprofunda descrierea tehnologiei \u0219i instruc\u021biunile pentru ad\u0103ugarea bibliotecii \u00een proiectul dumneavoastr\u0103, pe acest subiect au fost scrise suficiente articole:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460377\/\">Utilizarea Liquibase pentru gestionarea structurii bazei de date \u00eentr-o aplica\u021bie Spring Boot. Partea 1<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460907\/\">Utilizarea Liquibase pentru gestionarea structurii bazei de date \u00eentr-o aplica\u021bie Spring Boot. Partea 2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436994\/\">Liquibase \u0219i Maven<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/330662\/\">Abord\u0103ri pentru versionarea modific\u0103rilor bazei de date<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/271719\/\">Spring MVC\/Security, REST, Hibernate, Liquibase pornim \u00een dou\u0103 linii<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>\u00cen plus, a fost deja un articol excelent despre sfaturi utile:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/179425\/\">Utilizarea Liquibase f\u0103r\u0103 dureri de cap. 10 sfaturi din experien\u021ba real\u0103 de dezvoltare<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sovety\">Sfaturi<\/h2>\n<p><\/p>\n<p>Vreau s\u0103 \u00eemp\u0103rt\u0103\u0219esc sfaturile \u0219i comentariile mele, care s-au n\u0103scut prin sudoare, s\u00e2nge \u0219i durerea de a rezolva problemele de migrare.<\/p>\n<p><\/p>\n<h3 id=\"1--pered-rabotoy-sleduet-oznakomitsya-s-razdelom-luchshih-praktik-na-saytehttpswwwliquibaseorgbestpracticeshtml-liquibase\">1. \u00cenainte de a \u00eencepe, ar trebui s\u0103 te familiarizezi cu sec\u021biunea celor mai bune practici de pe <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">site<\/a><\/noindex> Liquibase<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">Acolo<\/a><\/noindex> Sunt descrise lucruri simple, dar foarte importante, f\u0103r\u0103 de care utilizarea bibliotecii v\u0103 poate complica via\u021ba. De exemplu, o abordare nestructurat\u0103 \u00een gestionarea changelist-urilor va duce mai devreme sau mai t\u00e2rziu la confuzie \u0219i migra\u021bii defectuoase. Dac\u0103 modific\u0103rile care depind una de alta \u00een structura bazei de date \u0219i logica serviciilor nu sunt implementate simultan, exist\u0103 o probabilitate mare ca acest lucru s\u0103 conduc\u0103 la teste e\u0219uate sau la un mediu defect. \u00cen plus, recomand\u0103rile privind utilizarea Liquibase de pe site-ul oficial con\u021bin un punct referitor la dezvoltarea \u0219i verificarea scripturilor de rollback \u00eempreun\u0103 cu scripturile principale de migrare. \u0218i \u00een articol <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/178665\/\">https:\/\/habr.com\/ru\/post\/178665\/<\/a><\/noindex> sunt exemple de cod referitoare la migra\u021bii \u0219i mecanismul de rollback. <\/p>\n<p><\/p>\n<h3 id=\"2-esli-nachali-ispolzovat-sredstva-migracii--ne-dopuskayte-manualnyh-ispravleniy-v-strukture-bazy\">2. Dac\u0103 a\u021bi \u00eenceput s\u0103 utiliza\u021bi instrumente de migra\u021bie, nu permite\u021bi modific\u0103ri manuale \u00een structura bazei de date.<\/h3>\n<p><\/p>\n<p>Cum se spune: \u201eOdat\u0103 Persil \u2014 \u00eentotdeauna Persil\u201d. Dac\u0103 baza de date a aplica\u021biei voastre a \u00eenceput s\u0103 fie gestionat\u0103 de Liquibase \u2014 orice modific\u0103ri manuale vor conduce instantaneu la un statut inconsistent, iar nivelul de \u00eencredere \u00een changelist-uri devine zero. Riscurile pot include c\u00e2teva ore pierdute pentru recuperarea bazei de date, iar \u00een cel mai r\u0103u caz \u2014 un server distrus. Dac\u0103 \u00een echipa voastr\u0103 exist\u0103 un DBA Architect \u201ede veche \u0219coal\u0103\u201d, explica\u021bi-i cu r\u0103bdare \u0219i aten\u021bie c\u00e2t de r\u0103u va fi dac\u0103 va edita baza de date dup\u0103 bunul s\u0103u plac dintr-un presupus SQL Developer. <\/p>\n<p><\/p>\n<h3 id=\"3-esli-chendzhset-uzhe-byl-zapushen-v-repozitoriy-izbegayte-redaktirovaniya\">3. Dac\u0103 changelist-ul a fost deja pus \u00een repo, evita\u021bi modific\u0103rile.<\/h3>\n<p><\/p>\n<p>Dac\u0103 un alt dezvoltator a f\u0103cut pull \u0219i a aplicat changelist-ul, care ulterior va fi editat, el v\u0103 va men\u021biona cu siguran\u021b\u0103 cu un cuv\u00e2nt bun atunci c\u00e2nd va primi o eroare la pornirea aplica\u021biei. Dac\u0103 modificarea changelist-ului cumva ajunge \u00een mediu de dezvoltare \u2014 va trebui s\u0103 parcurgere\u021bi un drum al hotfix-urilor. Problema esen\u021bial\u0103 este legat\u0103 de validarea modific\u0103rilor prin sum\u0103 de verificare \u2014 mecanismul principal al Liquibase. C\u00e2nd se editeaz\u0103 codul changelist-ului, suma de verificare se schimb\u0103. Modific\u0103rile changelist-urilor sunt posibile doar atunci c\u00e2nd exist\u0103 posibilitatea de a desf\u0103\u0219ura toat\u0103 baza de date de la zero f\u0103r\u0103 pierderi de date. \u00cen acest caz, refactorizarea codului SQL sau XML poate, dimpotriv\u0103, s\u0103 fac\u0103 migra\u021biile mai u\u0219or de citit. Un exemplu poate fi situa\u021bia \u00een care, la \u00eenceputul aplica\u021biei, schema bazei de date ini\u021biale a fost convenit\u0103 \u00een cadrul echipei. <\/p>\n<p><\/p>\n<h3 id=\"4--imey-proverennye-bekapy-baz-dannyh-esli-eto-vozmozhno\">4. Asigur\u0103-te c\u0103 ai copii de siguran\u021b\u0103 verificate ale bazelor de date, dac\u0103 este posibil<\/h3>\n<p><\/p>\n<p>Aici, cred c\u0103 totul este clar. \u00cen cazul \u00een care migrarea a avut loc e\u0219uat, totul poate fi restabilit. \u00cen Liquibase exist\u0103 un instrument pentru revenirea modific\u0103rilor, dar scripturile pentru revenire sunt scrise de asemenea de dezvoltator, iar \u00een ele pot ap\u0103rea probleme cu aceea\u0219i probabilitate ca \u0219i \u00een scripturile setului de schimb\u0103ri ini\u021bial. Acest lucru \u00eenseamn\u0103 c\u0103 este util s\u0103 te protejezi cu copii de siguran\u021b\u0103 \u00een orice caz. <\/p>\n<p><\/p>\n<h3 id=\"5-ispolzuy-proverennye-bekapy-baz-dannyh-v-razrabotke-esli-eto-vozmozhno\">5. Folose\u0219te copii de siguran\u021b\u0103 verificate ale bazelor de date \u00een dezvoltare, dac\u0103 este posibil<\/h3>\n<p><\/p>\n<p>Dac\u0103 acest lucru nu contravine contractelor \u0219i politicii de confiden\u021bialitate, \u00een baza nu sunt date personale, \u0219i nu este mai grea dec\u00e2t dou\u0103 soare \u2014 \u00eenainte de aplicarea migra\u021biilor pe servere active, po\u021bi verifica cum va func\u021biona pe ma\u0219ina dezvoltatorului \u0219i po\u021bi identifica aproape 100% din problemele poten\u021biale ce pot ap\u0103rea \u00een timpul migra\u021biei. <\/p>\n<p><\/p>\n<h3 id=\"6-obschaysya-s-drugimi-razrabotchikami-v-komande\">6. Comunic\u0103 cu al\u021bi dezvoltatori din echip\u0103<\/h3>\n<p><\/p>\n<p>\u00centr-un proces de dezvoltare bine organizat, to\u021bi din echip\u0103 \u0219tiu cine este ocupat cu ce. \u00cen realitate, adesea nu este a\u0219a, a\u0219a c\u0103, dac\u0103 \u00een cadrul sarcinii tale preg\u0103te\u0219ti modific\u0103ri ale structurii bazei de date, este de preferat s\u0103 informezi suplimentar \u00eentreaga echip\u0103 despre acest lucru. Dac\u0103 cineva face modific\u0103ri \u00een paralel, ar trebui s\u0103 v\u0103 organiza\u021bi cu grij\u0103. Este important s\u0103 comunici \u0219i dup\u0103 finalizarea lucr\u0103rii, nu doar la \u00eenceput. Multe probleme poten\u021biale cu seturile de schimb\u0103ri pot fi rezolvate \u00een etapa de revizuire a codului. <\/p>\n<p><\/p>\n<h3 id=\"7-dumay-chto-delaesh\">7. G\u00e2nde\u0219te-te la ceea ce faci!<\/h3>\n<p><\/p>\n<p>De parc\u0103 ar fi un sfat evident, aplicabil \u00een orice situa\u021bie. Cu toate acestea, multe probleme ar putea fi evitate dac\u0103 dezvoltatorul ar analiza \u00eenc\u0103 o dat\u0103 ce face \u0219i la ce ar putea afecta. Lucrul cu migra\u021biile necesit\u0103 \u00eentotdeauna o aten\u021bie suplimentar\u0103 \u0219i precau\u021bie. <\/p>\n<p><\/p>\n<h2 id=\"lovushki\">Capcane<\/h2>\n<p><\/p>\n<p>Acum s\u0103 analiz\u0103m capcanele tipice \u00een care po\u021bi c\u0103dea dac\u0103 nu urmezi recomand\u0103rile de mai sus, \u0219i ce ar trebui s\u0103 faci de fapt?<\/p>\n<p><\/p>\n<h3 id=\"situaciya-1-dva-razrabotchika-pytayutsya-odnovremenno-dobavlyat-novye-chendzhsety\">Situa\u021bia 1. Doi dezvoltatori \u00eencearc\u0103 s\u0103 adauge simultan seturi de schimb\u0103ri noi<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cum s\u0103 nu te \u00eempu\u0219ti \u00een picior folosind Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/20706fc970510bc06634fa001a4c7ceb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVasia \u0219i Petia doresc s\u0103 creeze un set de schimb\u0103ri pentru versiunea 4, f\u0103r\u0103 s\u0103 \u0219tie unul despre altul. Au efectuat modific\u0103ri \u00een structura bazei de date \u0219i au trimis un pull request, cu fi\u0219iere diferite de seturi de schimb\u0103ri. Se propune urm\u0103torul mecanism de ac\u021biune:<\/p>\n<p><\/p>\n<h4 id=\"kak-reshat\">Cum s\u0103 rezolvi<\/h4>\n<p><\/p>\n<ol>\n<li>Cumva, colegii trebuie s\u0103 se pun\u0103 de acord cu privire la ordinea \u00een care trebuie s\u0103 vin\u0103 seturile lor de schimb\u0103ri, s\u0103 presupunem c\u0103 setul lui Petia trebuie aplicat primul. <\/li>\n<li>Cineva trebuie s\u0103 adauge al doilea element \u0219i s\u0103 marcheze changset-ul lui Vasia cu versiunea 5. Aceasta poate fi realizat\u0103 prin Cherry Pick sau un merge atent. <\/li>\n<li>Dup\u0103 modific\u0103ri, este esen\u021bial s\u0103 verifica\u021bi validitatea ac\u021biunilor efectuate.<br \/>\nDe fapt, mecanismele Liquibase permit s\u0103 existe \u00een repository dou\u0103 changset-uri de versiune 4, astfel \u00eenc\u00e2t le pute\u021bi l\u0103sa pe toate a\u0219a cum sunt. Adic\u0103 ve\u021bi avea pur \u0219i simplu dou\u0103 modific\u0103ri pentru versiunea 4 cu denumiri diferite. \u00cen aceast\u0103 abordare, devine foarte complicat s\u0103 naviga\u021bi prin versiunile bazei de date ulterior. <\/li>\n<\/ol>\n<p><\/p>\n<p>\u00cen plus, Liquibase, ca \u0219i casa hobbi\u021bilor, ascunde multe secrete. Unul dintre acestea este cheia validCheckSum, care a ap\u0103rut cu versiunea 1.7 \u0219i permite specificarea unei valori valide a hash-ului pentru un anumit changset, indiferent de ceea ce este stocat \u00een baza de date. Documenta\u021bia <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/changeset.html\">https:\/\/www.liquibase.org\/documentation\/changeset.html<\/a><\/noindex> spune urm\u0103toarele:<\/p>\n<p><\/p>\n<blockquote><p>Ad\u0103uga\u021bi un checksum considerat valid pentru acest changeSet, indiferent de ceea ce este stocat \u00een baza de date. Utilizat \u00een principal atunci c\u00e2nd trebuie s\u0103 schimba\u021bi un changeSet \u0219i nu dori\u021bi s\u0103 apar\u0103 erori pe bazele de date pe care a fost deja rulat (nu este o procedur\u0103 recomandat\u0103)<\/p><\/blockquote>\n<p>Da, da, o astfel de procedur\u0103 nu este recomandat\u0103. Dar uneori un vr\u0103jitor puternic \u0219i luminos st\u0103p\u00e2ne\u0219te \u0219i tehnici \u00eentunecate. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-2-migraciya-kotoraya-zavisit-ot-dannyh\">Situa\u021bia 2. Migrarea care depinde de date.<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cum s\u0103 nu te \u00eempu\u0219ti \u00een picior folosind Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/31a6eebb55278c0631115bf16483c7b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Presupun\u00e2nd c\u0103 nu ave\u021bi posibilitatea de a utiliza backup-uri ale bazelor de date de pe serverele live. Petya a creat un changset, l-a verificat local \u0219i cu o \u00eencredere total\u0103 \u00een corectitudinea sa a f\u0103cut un pull request \u00een dezvoltare. Liderul proiectului, de precau\u021bie, a \u00eentrebat dac\u0103 Petya l-a verificat, \u0219i apoi l-a integrat. Dar desf\u0103\u0219urarea pe serverul de dezvoltare a picat.<\/p>\n<p><\/p>\n<p>De fapt, a\u0219a ceva este posibil, \u0219i nimeni nu este protejat de acest lucru. Se \u00eent\u00e2mpl\u0103 atunci c\u00e2nd modific\u0103rile structurii tabelelor sunt somehow legate de datele specifice din baza de date. Este evident c\u0103, dac\u0103 baza lui Petya este umplut\u0103 doar cu date de test, aceasta poate s\u0103 nu acopere toate cazurile problematice. De exemplu, atunci c\u00e2nd se \u0219terge o tabel\u0103, se descoper\u0103 c\u0103 exist\u0103 \u00eenregistr\u0103ri \u00een alte tabele prin Foreign Key, legate de \u00eenregistr\u0103rile din tabel\u0103. Sau, c\u00e2nd se schimb\u0103 tipul unei coloane, se dovede\u0219te c\u0103 nu 100% din date pot fi transformate \u00een noul tip. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-1\">Cum s\u0103 rezolvi<\/h4>\n<p><\/p>\n<ul>\n<li>Scrie\u021bi scripturi speciale care vor fi aplicate o singur\u0103 dat\u0103 \u00eempreun\u0103 cu migrarea \u0219i vor aduce datele \u00een form\u0103 corespunz\u0103toare. Aceasta este o abordare general\u0103 pentru a rezolva problema transferului de date \u00een noi structuri deja dup\u0103 aplicarea migra\u021biilor, dar ceva similar poate fi aplicat \u0219i \u00eenainte, \u00een cazuri particulare. Aceast\u0103 alegere, desigur, nu este \u00eentotdeauna disponibil\u0103, deoarece editarea datelor pe servere active poate fi periculoas\u0103 \u0219i chiar devastatoare. <\/li>\n<li>O alt\u0103 cale complicat\u0103 este de a modifica changsetul existent. Dificultatea const\u0103 \u00een faptul c\u0103 toate bazele de date unde acesta a fost deja aplicat \u00een forma sa actual\u0103 trebuie restaurate. Este foarte posibil ca \u00eentreaga echip\u0103 de backend s\u0103 fie nevoit\u0103 s\u0103 re\u00eenc\u0103rca\u021bi local baza de date de la zero. <\/li>\n<li>Cea mai universal\u0103 abordare este s\u0103 se mute problema datelor \u00een mediul dezvoltatorului, recre\u00e2nd aceea\u0219i situa\u021bie \u0219i ad\u0103ug\u00e2nd un nou changset, \u00eenainte de cel defect, care va permite ocolirea problemei.<br \/>\n<img decoding=\"async\" alt=\"Cum s\u0103 nu te \u00eempu\u0219ti \u00een picior folosind Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/b5d28a940a7a35b6cd7a819a8e68f027.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>\u00cen general, cu c\u00e2t baza de date se aseam\u0103n\u0103 mai bine cu baza serverului de produc\u021bie, cu at\u00e2t mai pu\u021bin este riscul ca problemele cu migra\u021biile s\u0103 fie de amploare. \u0218i, desigur, \u00eenainte de a trimite changsetul \u00een repository, merit\u0103 s\u0103 te g\u00e2nde\u0219ti de c\u00e2teva ori dac\u0103 nu va strica ceva. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-3-liquibase-nachinaet-primenyatsya-uzhe-posle-vyhoda-v-prodakshn\">Situa\u021bia 3. Liquibase \u00eencepe s\u0103 fie aplicat dup\u0103 ce a fost lansat \u00een produc\u021bie.<\/h3>\n<p><\/p>\n<p>S\u0103 presupunem c\u0103 team leader-ul i-a cerut lui Petya s\u0103 integreze Liquibase \u00een proiect, \u00eens\u0103 proiectul este deja \u00een produc\u021bie \u0219i exist\u0103 deja o structur\u0103 de baz\u0103 existent\u0103.<\/p>\n<p><\/p>\n<p>Prin urmare, problema const\u0103 \u00een faptul c\u0103 pe orice noi servere sau ma\u0219ini ale dezvoltatorilor, datele acestor tabele trebuie recreate de la zero, iar mediul existent trebuie s\u0103 r\u0103m\u00e2n\u0103 \u00eentr-o stare consistent\u0103, preg\u0103tit\u0103 s\u0103 accepte noile changsets. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-2\">Cum s\u0103 rezolvi<\/h4>\n<p><\/p>\n<p>Exist\u0103 \u0219i aici mai multe op\u021biuni:<\/p>\n<p><\/p>\n<ul>\n<li>Prima \u0219i cea mai evident\u0103 este de a avea un script separat, care trebuie aplicat manual la ini\u021bializarea noii medii. <\/li>\n<li>A doua op\u021biune \u2014 mai pu\u021bin evident\u0103, este de a avea o migra\u021bie Liquibase care se afl\u0103 \u00eentr-un alt Context Liquibase \u0219i de a o aplica. Mai multe informa\u021bii despre Contextul Liquibase pot fi citite aici: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/contexts.html\">https:\/\/www.liquibase.org\/documentation\/contexts.html<\/a><\/noindex>. \u00cen general, acesta este un mecanism interesant, care poate fi aplicat cu succes, de exemplu, pentru testare. <\/li>\n<li>A treia cale const\u0103 din mai mul\u021bi pa\u0219i. Mai \u00eent\u00e2i, trebuie creat\u0103 o migra\u021bie pentru tabelele deja existente. Apoi, aceasta trebuie aplicat\u0103 pe un anumit mediu, iar astfel va fi ob\u021binut\u0103 suma hash. Urm\u0103torul pas este s\u0103 ini\u021bializ\u0103m tabelele Liquibase goale pe serverul nostru care nu este gol, iar \u00een tabelul cu istoricul aplic\u0103rii changelog-urilor, putem ad\u0103uga manual o \u00eenregistrare despre un changelog \u201eaplicat\u201d cu modific\u0103rile deja existente \u00een baz\u0103. Astfel, pe serverul deja existent, num\u0103r\u0103toarea istoricului va \u00eencepe de la versiunea 2, iar toate noile medii se vor comporta identic.<br \/>\n<img decoding=\"async\" alt=\"Cum s\u0103 nu te \u00eempu\u0219ti \u00een picior folosind 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\">Situa\u021bia 4. Migra\u021biile devin uria\u0219e \u0219i nu reu\u0219esc s\u0103 fie executate la timp.<\/h3>\n<p><\/p>\n<p>La \u00eenceputul dezvolt\u0103rii serviciului, de obicei, Liquibase este folosit ca o dependen\u021b\u0103 extern\u0103, iar toate migra\u021biile sunt procesate la pornirea aplica\u021biei. Cu toate acestea, \u00een timp, s-ar putea s\u0103 te confrun\u021bi cu urm\u0103toarele cazuri:<\/p>\n<p><\/p>\n<ul>\n<li>Migra\u021biile devin uria\u0219e \u0219i dureaz\u0103 mult timp pentru a fi executate.<\/li>\n<li>Apare necesitatea migra\u021biei \u00een medii distribuite, de exemplu, pe mai multe instan\u021be ale serverelor de baze de date simultan.<br \/>\n\u00cen acest caz, aplicarea prea lent\u0103 a migra\u021biilor va duce la timeout-uri la pornirea aplica\u021biei. \u00cen plus, aplicarea migra\u021biilor pentru fiecare instan\u021b\u0103 a aplica\u021biei separat poate duce la faptul c\u0103 diferite servere vor ajunge s\u0103 fie \u00een stare nesincronizat\u0103. <\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"kak-reshat-3\">Cum s\u0103 rezolvi<\/h4>\n<p><\/p>\n<p>\u00cen astfel de cazuri, proiectul t\u0103u este deja mare, poate chiar matur, \u0219i Liquibase \u00eencepe s\u0103 func\u021bioneze ca un instrument extern distinct. Problema este c\u0103 Liquibase, ca bibliotec\u0103, este compilat\u0103 \u00eentr-un fi\u0219ier jar \u0219i poate func\u021biona at\u00e2t ca o dependen\u021b\u0103 \u00een interiorul proiectului, c\u00e2t \u0219i autonom. <\/p>\n<p><\/p>\n<p>\u00cen modul autonom, po\u021bi l\u0103sa aplica\u021bia migra\u021biilor pe mediu CI\/CD sau pe umerii puternici ai administratorilor de sistem specializa\u021bi \u00een implementare. Pentru aceasta, va fi nevoie de linia de comand\u0103 Liquibase. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/command_line.html\">https:\/\/www.liquibase.org\/documentation\/command_line.html<\/a><\/noindex>\u00cen acest mod, exist\u0103 posibilitatea de a lansa aplica\u021bia dup\u0103 ce toate migra\u021biile necesare au fost efectuate.<\/p>\n<p><\/p>\n<h2 id=\"vyvod\">Ie\u0219ire<\/h2>\n<p><\/p>\n<p>\u00cen realitate, capcanele \u00een lucrul cu migrarea bazelor de date pot fi mult mai numeroase, iar multe dintre ele necesit\u0103 o abordare creativ\u0103. Este important s\u0103 \u00een\u021belegem c\u0103, dac\u0103 folosim corect instrumentul, majoritatea acestor capcane pot fi evitate. Personal, am \u00eent\u00e2lnit diferite forme ale tuturor problemelor men\u021bionate, iar unele dintre ele au fost rezultatul gre\u0219elilor mele. De obicei, aceste situa\u021bii apar din neaten\u021bie, dar uneori \u2013 dintr-o incapacitate flagrant\u0103 de a folosi instrumentul.<\/p>\n<p>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Cum s\u0103 nu te \u00eempu\u0219ti \u00een picior folosind Liquibase | ProHoster","description":"Niciodat\u0103 nu a fost, \u0219i iat\u0103 c\u0103 din nou! \u00centr-un nou proiect, am decis s\u0103 folosim Liquibase de la \u00eenceput, pentru a evita problemele \u00een viitor.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/70973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=70973"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/70973\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/70974"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=70973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=70973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=70973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}