{"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\/sv\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","title":{"rendered":"Hur man undviker att skjuta sig sj\u00e4lv i foten med Liquibase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Aldrig har det varit s\u00e5, och nu igen!<\/p>\n<p><\/p>\n<p>I v\u00e5rt senaste projekt best\u00e4mde vi oss f\u00f6r att anv\u00e4nda Liquibase fr\u00e5n b\u00f6rjan f\u00f6r att undvika problem i framtiden. Det visade sig att inte alla unga medlemmar i teamet vet hur man anv\u00e4nder det p\u00e5 r\u00e4tt s\u00e4tt. Jag h\u00e5ll en intern workshop som jag sedan best\u00e4mde mig f\u00f6r att omvandla till en artikel. <\/p>\n<p><\/p>\n<p>Artikeln inneh\u00e5ller anv\u00e4ndbara tips och en beskrivning av tre av de mest uppenbara f\u00e4llorna man kan g\u00e5 i n\u00e4r man arbetar med verktyg f\u00f6r migrering av relationsdatabaser, s\u00e4rskilt Liquibase. Den \u00e4r avsedd f\u00f6r Java-utvecklare p\u00e5 junior- och mellanniv\u00e5, medan mer erfarna utvecklare kan finna den intressant f\u00f6r att strukturera och repetera s\u00e5dant de troligen redan k\u00e4nner till. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hur man undviker att skjuta sig sj\u00e4lv i foten med 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 och Flyway \u00e4r de tv\u00e5 huvudsakliga konkurrerande teknologierna f\u00f6r att hantera versionering av relationsstrukturer i Java-v\u00e4rlden. Den f\u00f6rsta \u00e4r helt gratis och brukar praktiskt taget oftare v\u00e4ljas f\u00f6r anv\u00e4ndning, d\u00e4rf\u00f6r \u00e4r det Liquibase som valts som huvud\u00e4mne f\u00f6r publiceringen. Trots detta kan vissa av de beskrivna praktikerna vara universella beroende p\u00e5 arkitekturen av din applikation. <\/p>\n<p><\/p>\n<p>Migrering av relationsstrukturer har blivit ett n\u00f6dv\u00e4ndigt s\u00e4tt att hantera den svaga flexibiliteten hos relationsdatabaslagring. Under den tid d\u00e5 OOP var popul\u00e4rt innebar arbetet med databaser att vi en g\u00e5ng beskrev schemat och inte skulle \u00e4ndra det igen. Men verkligheten \u00e4r alltid s\u00e5dan att allt f\u00f6r\u00e4ndras och f\u00f6r\u00e4ndringar i tabellstrukturer kr\u00e4vs ganska ofta. Naturligtvis kan sj\u00e4lva processen vara sm\u00e4rtsam och obehaglig. <\/p>\n<p><\/p>\n<p>Jag kommer inte att g\u00e5 djupare in p\u00e5 beskrivningen av teknologin och instruktionerna f\u00f6r att l\u00e4gga till biblioteket i ditt projekt, det har redan skrivits tillr\u00e4ckligt med artiklar om det:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460377\/\">Anv\u00e4ndning av Liquibase f\u00f6r att hantera databasstrukturen i ett Spring Boot-projekt. Del 1<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460907\/\">Anv\u00e4ndning av Liquibase f\u00f6r att hantera databasstrukturen i ett Spring Boot-projekt. Del 2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436994\/\">Liquibase och Maven<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/330662\/\">Metoder f\u00f6r att versionera databas\u00e4ndringar<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/271719\/\">Spring MVC\/Security, REST, Hibernate, Liquibase startar i tv\u00e5 rader<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Dessutom har det redan funnits en utm\u00e4rkt artikel med anv\u00e4ndbara tips:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/179425\/\">Anv\u00e4nda Liquibase utan huvudv\u00e4rk. 10 tips fr\u00e5n verklig utveckling<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sovety\">Tips<\/h2>\n<p><\/p>\n<p>Jag vill dela med mig av mina tips och kommentarer som f\u00f6ddes genom svett, blod och sm\u00e4rta fr\u00e5n att l\u00f6sa migrationsproblem.<\/p>\n<p><\/p>\n<h3 id=\"1--pered-rabotoy-sleduet-oznakomitsya-s-razdelom-luchshih-praktik-na-saytehttpswwwliquibaseorgbestpracticeshtml-liquibase\">1. Innan arbetet p\u00e5b\u00f6rjas b\u00f6r man bekanta sig med avsnittet om b\u00e4sta praxis p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">webbplats<\/a><\/noindex> Liquibase<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">D\u00e4r<\/a><\/noindex> Enkla men viktiga aspekter beskrivs h\u00e4r, utan vilka anv\u00e4ndningen av biblioteket kan bli komplicerad. Till exempel, en icke-strukturerad metod f\u00f6r hantering av changsets leder f\u00f6rr eller senare till f\u00f6rvirring och trasiga migrationer. Om man g\u00f6r beroende f\u00f6r\u00e4ndringar av databasstrukturen och tj\u00e4nsternas logik utan att utf\u00f6ra dem samtidigt, \u00f6kar risken f\u00f6r att detta resulterar i r\u00f6da tester eller en trasig milj\u00f6. Dessutom inneh\u00e5ller rekommendationerna f\u00f6r anv\u00e4ndning av Liquibase p\u00e5 den officiella webbplatsen ett avsnitt om att utveckla och testa rollback-skript tillsammans med huvud-migreringsskripten. N\u00e5v\u00e4l, i artikeln <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/178665\/\">https:\/\/habr.com\/ru\/post\/178665\/<\/a><\/noindex> finns exempel p\u00e5 kod som r\u00f6r migrationer och rollback-mekanismen. <\/p>\n<p><\/p>\n<h3 id=\"2-esli-nachali-ispolzovat-sredstva-migracii--ne-dopuskayte-manualnyh-ispravleniy-v-strukture-bazy\">2. Om ni har b\u00f6rjat anv\u00e4nda migrationsverktyg \u2013 till\u00e5t inte manuella \u00e4ndringar i databasstrukturen.<\/h3>\n<p><\/p>\n<p>Som man s\u00e4ger: \"En g\u00e5ng Persil - alltid Persil\". Om er applikationsdatabas har b\u00f6rjat hanteras av Liquibase, leder alla manuella \u00e4ndringar omedelbart till ett inkonsekvent tillst\u00e5nd, och tilliten till changsets sjunker till noll. Potentiella risker inkluderar timmar av arbete f\u00f6r att \u00e5terst\u00e4lla databasen, och i v\u00e4rsta fall \u2013 en kraschad server. Om det finns en DBA-arkitekt i ert team \"av den gamla skolan\", f\u00f6rklara t\u00e5lmodigt och eftert\u00e4nksamt hur illa det kan bli om han redigerar databasen efter eget tycke i n\u00e5got hypotetiskt SQL Developer. <\/p>\n<p><\/p>\n<h3 id=\"3-esli-chendzhset-uzhe-byl-zapushen-v-repozitoriy-izbegayte-redaktirovaniya\">3. Om changset redan har pushats till repositoriet, undvik att redigera.<\/h3>\n<p><\/p>\n<p>Om en annan utvecklare g\u00f6r en pull och till\u00e4mpar ett changset som senare kommer att redigeras \u2013 kommer han definitivt att n\u00e4mna dig med v\u00e4nliga ord n\u00e4r han f\u00e5r ett fel vid start av applikationen. Om redigeringen av changset p\u00e5 n\u00e5got s\u00e4tt l\u00e4cker in i utvecklingsmilj\u00f6n \u2013 m\u00e5ste man navigera den hala v\u00e4gen av hotfixar. Problemet handlar om validering av \u00e4ndringar via hash-v\u00e4rde \u2013 den grundl\u00e4ggande mekanismen i Liquibase. N\u00e4r kod i changset redigeras \u00e4ndras hash-v\u00e4rdet. Redigering av changsets \u00e4r endast m\u00f6jligt n\u00e4r det finns m\u00f6jlighet att \u00e5terst\u00e4lla hela databasen fr\u00e5n b\u00f6rjan utan datarf\u00f6rlust. I s\u00e5dana fall kan refactoring av SQL- eller XML-koden faktiskt underl\u00e4tta arbetet och g\u00f6ra migrationer mer l\u00e4sbara. Ett exempel kan vara situationen n\u00e4r schemat f\u00f6r den ursprungliga databasen godk\u00e4ndes inom teamet i b\u00f6rjan av applikationen. <\/p>\n<p><\/p>\n<h3 id=\"4--imey-proverennye-bekapy-baz-dannyh-esli-eto-vozmozhno\">4. Ha verifierade databackups, om m\u00f6jligt<\/h3>\n<p><\/p>\n<p>H\u00e4r \u00e4r jag s\u00e4ker p\u00e5 att allt \u00e4r klart. Om migrationen misslyckas kan allt \u00e5terst\u00e4llas. I Liquibase finns ett verktyg f\u00f6r att \u00e5ngra \u00e4ndringar, men skripten f\u00f6r att \u00e5ngra beh\u00f6ver ocks\u00e5 skrivas av utvecklaren sj\u00e4lv, och de kan ha lika stora problem som skripten f\u00f6r den ursprungliga f\u00f6r\u00e4ndringsupps\u00e4ttningen. Detta inneb\u00e4r att det \u00e4r bra att vara f\u00f6rutseende med backup. <\/p>\n<p><\/p>\n<h3 id=\"5-ispolzuy-proverennye-bekapy-baz-dannyh-v-razrabotke-esli-eto-vozmozhno\">5. Anv\u00e4nd verifierade databackups i utvecklingen, om m\u00f6jligt<\/h3>\n<p><\/p>\n<p>Om det inte strider mot avtal och sekretess, om databasen inte inneh\u00e5ller personuppgifter och inte v\u00e4ger som tv\u00e5 solar \u2014 innan migrationen till levande servrar kan det vara bra att testa hur det fungerar p\u00e5 utvecklarens maskin och ber\u00e4kna n\u00e4stan 100% av de potentiella problemen vid migreringen. <\/p>\n<p><\/p>\n<h3 id=\"6-obschaysya-s-drugimi-razrabotchikami-v-komande\">6. Kommunicera med andra utvecklare i teamet<\/h3>\n<p><\/p>\n<p>I en v\u00e4lorganiserad utvecklingsprocess vet alla i teamet vem som g\u00f6r vad. I verkligheten \u00e4r det ofta inte s\u00e5, s\u00e5 om du g\u00f6r \u00e4ndringar i databasstrukturen inom din uppgift, \u00e4r det bra att informera hela teamet om detta. Om n\u00e5gon g\u00f6r \u00e4ndringar parallellt \u2014 b\u00f6r du organisera er noggrant. Det \u00e4r bra att kommunicera med kollegor \u00e4ven efter att jobbet \u00e4r klart, inte bara i b\u00f6rjan. M\u00e5nga potentiella problem med f\u00f6r\u00e4ndringsupps\u00e4ttningar kan l\u00f6sas i kodgranskningen. <\/p>\n<p><\/p>\n<h3 id=\"7-dumay-chto-delaesh\">7. T\u00e4nk p\u00e5 vad du g\u00f6r!<\/h3>\n<p><\/p>\n<p>Det verkar som en sj\u00e4lvklarhet, till\u00e4mplig i alla situationer. Men m\u00e5nga problem skulle kunnat undvikas om utvecklaren analyserade en g\u00e5ng till vad han g\u00f6r och vilken p\u00e5verkan det kan ha. Att arbeta med migrationer kr\u00e4ver alltid extra uppm\u00e4rksamhet och noggrannhet. <\/p>\n<p><\/p>\n<h2 id=\"lovushki\">F\u00e4llor<\/h2>\n<p><\/p>\n<p>L\u00e5t oss nu se p\u00e5 typiska f\u00e4llor man kan hamna i om man inte f\u00f6ljer ovanst\u00e5ende r\u00e5d, och vad man egentligen ska g\u00f6ra?<\/p>\n<p><\/p>\n<h3 id=\"situaciya-1-dva-razrabotchika-pytayutsya-odnovremenno-dobavlyat-novye-chendzhsety\">Situation 1. Tv\u00e5 utvecklare f\u00f6rs\u00f6ker samtidigt l\u00e4gga till nya f\u00f6r\u00e4ndringsupps\u00e4ttningar<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hur man undviker att skjuta sig sj\u00e4lv i foten med Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/20706fc970510bc06634fa001a4c7ceb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVanya och Petya vill skapa f\u00f6r\u00e4ndringsupps\u00e4ttning version 4 utan att veta om varandra. De har gjort \u00e4ndringar i databasstrukturen och skickat pull request med olika filer f\u00f6r f\u00f6r\u00e4ndringsupps\u00e4ttningen. F\u00f6ljande mekanism f\u00f6resl\u00e5s:<\/p>\n<p><\/p>\n<h4 id=\"kak-reshat\">Hur man l\u00f6ser<\/h4>\n<p><\/p>\n<ol>\n<li>P\u00e5 n\u00e5got s\u00e4tt m\u00e5ste kollegorna komma \u00f6verens om i vilken ordning deras f\u00f6r\u00e4ndringsupps\u00e4ttningar ska g\u00e5, l\u00e5t oss s\u00e4ga att Petyas ska till\u00e4mpas f\u00f6rst. <\/li>\n<li>N\u00e5gon m\u00e5ste l\u00e4gga till den andra till sig sj\u00e4lv och markera Vasas changset med version 5. Detta kan g\u00f6ras genom Cherry Pick eller en noggrann merge. <\/li>\n<li>Efter \u00e4ndringarna b\u00f6r man alltid kontrollera giltigheten av de utf\u00f6rda \u00e5tg\u00e4rderna.<br \/>\nI sj\u00e4lva verket till\u00e5ter Liquibase-mekanismerna att ha tv\u00e5 changsets i version 4 i repositoryn, s\u00e5 det g\u00e5r bra att l\u00e4mna allt som det \u00e4r. Det vill s\u00e4ga att ni bara kommer att ha tv\u00e5 f\u00f6r\u00e4ndringar av version 4 med olika namn. Med detta tillv\u00e4gag\u00e5ngss\u00e4tt blir det mycket sv\u00e5rt att navigera i databaskversionerna senare. <\/li>\n<\/ol>\n<p><\/p>\n<p>Dessutom, precis som hobbitarnas hem, d\u00f6ljer Liquibase m\u00e5nga hemligheter. En av dem \u00e4r nyckeln validCheckSum, som introducerades i version 1.7 och g\u00f6r det m\u00f6jligt att ange ett giltigt v\u00e4rde f\u00f6r hash-summan f\u00f6r ett specifikt changset oavsett vad som lagras i databasen. Dokumentationen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/changeset.html\">https:\/\/www.liquibase.org\/documentation\/changeset.html<\/a><\/noindex> s\u00e4ger f\u00f6ljande:<\/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>Ja, ja, en s\u00e5dan procedur rekommenderas inte. Men ibland beh\u00e4rskar en m\u00e4ktig ljus magiker \u00e4ven de m\u00f6rka teknikerna. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-2-migraciya-kotoraya-zavisit-ot-dannyh\">Situation 2. Migration som beror p\u00e5 data<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Hur man undviker att skjuta sig sj\u00e4lv i foten med Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/31a6eebb55278c0631115bf16483c7b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Anta att du inte har m\u00f6jlighet att anv\u00e4nda s\u00e4kerhetskopior av databaser fr\u00e5n aktiva servrar. Petya skapade ett changset, kontrollerade det lokalt och med full sj\u00e4lvs\u00e4kerhet gjorde han en pull request till utvecklingen. Projektledaren kollade f\u00f6r s\u00e4kerhets skull om Petya hade kontrollerat det och sedan fusionerade han. Men deployment p\u00e5 utvecklingsservern misslyckades.<\/p>\n<p><\/p>\n<p>I sj\u00e4lva verket \u00e4r detta m\u00f6jligt, och ingen \u00e4r skyddad mot det. Detta sker om tabellstrukturerna p\u00e5 n\u00e5got s\u00e4tt \u00e4r kopplade till specifika data fr\u00e5n databasen. Det \u00e4r uppenbart att om Petyas databas bara \u00e4r fylld med testdata, s\u00e5 kan den kanske inte t\u00e4cka alla problematiska fall. Till exempel, vid borttagning av en tabell visar det sig att det finns poster i andra tabeller via Foreign Key som \u00e4r kopplade till poster i den borttagna. Eller vid \u00e4ndring av kolumntypen visar det sig att inte 100% av data kan konverteras till den nya typen. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-1\">Hur man l\u00f6ser<\/h4>\n<p><\/p>\n<ul>\n<li>Skriva speciella skript som en g\u00e5ng kommer att anv\u00e4ndas tillsammans med migreringen f\u00f6r att f\u00f6ra data i r\u00e4tt skick. Detta \u00e4r en generell v\u00e4g f\u00f6r att l\u00f6sa problemet med att \u00f6verf\u00f6ra data till nya strukturer efter att migreringarna har utf\u00f6rts, men n\u00e5got liknande kan till\u00e4mpas \u00e4ven f\u00f6re, i vissa fall. S\u00e5dana l\u00f6sningar \u00e4r sj\u00e4lvklart inte alltid tillg\u00e4ngliga, eftersom att redigera data p\u00e5 aktiva servrar kan vara riskabelt och till och med katastrofalt. <\/li>\n<li>En annan komplex v\u00e4g \u00e4r att redigera den befintliga changset. Komplikationen ligger i att alla databaser d\u00e4r den har till\u00e4mpats i sin nuvarande form m\u00e5ste \u00e5terst\u00e4llas. Det \u00e4r fullt m\u00f6jligt att hela backend-teamet tvingas lokalt installera databasen fr\u00e5n grunden. <\/li>\n<li>Och den mest universella v\u00e4gen \u00e4r att flytta problemet med data till utvecklarens milj\u00f6 genom att \u00e5terskapa samma situation och l\u00e4gga till en ny changset, f\u00f6re den trasiga, som g\u00f6r det m\u00f6jligt att kringg\u00e5 problemet.<br \/>\n<img decoding=\"async\" alt=\"Hur man undviker att skjuta sig sj\u00e4lv i foten med Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/b5d28a940a7a35b6cd7a819a8e68f027.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>Generellt sett, ju mer databasen i fr\u00e5ga liknar produktionsserverns databaser, desto mindre chans \u00e4r det att migrationsproblem uppst\u00e5r. Och sj\u00e4lvklart, innan man skickar changset till ett repository, b\u00f6r man t\u00e4nka flera g\u00e5nger p\u00e5 om det kommer att krossa n\u00e5got. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-3-liquibase-nachinaet-primenyatsya-uzhe-posle-vyhoda-v-prodakshn\">Situation 3. Liquibase b\u00f6rjar till\u00e4mpas f\u00f6rst efter produktionslanseringen.<\/h3>\n<p><\/p>\n<p>Anta att teamledaren har bett Petja att ansluta Liquibase i projektet, men projektet \u00e4r redan i produktion och det finns redan en befintlig databasstruktur.<\/p>\n<p><\/p>\n<p>Problemet \u00e4r s\u00e5ledes att p\u00e5 varje nya servrar eller utvecklarmaskiner m\u00e5ste de h\u00e4r tabellerna \u00e5terskapas fr\u00e5n grunden, medan den redan existerande milj\u00f6n m\u00e5ste f\u00f6rbli i ett konsekvent tillst\u00e5nd, redo att ta emot nya changset. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-2\">Hur man l\u00f6ser<\/h4>\n<p><\/p>\n<p>H\u00e4r finns ocks\u00e5 flera m\u00f6jliga v\u00e4gar:<\/p>\n<p><\/p>\n<ul>\n<li>Det f\u00f6rsta och mest uppenbara \u00e4r att ha ett separat skript som m\u00e5ste till\u00e4mpas manuellt vid initiering av en ny milj\u00f6. <\/li>\n<li>Det andra, mindre uppenbara, \u00e4r att ha en Liquibase-migrering som tillh\u00f6r en annan Liquibase-kontext och till\u00e4mpa den. Mer information om Liquibase-kontext kan l\u00e4sas h\u00e4r: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/contexts.html\">https:\/\/www.liquibase.org\/documentation\/contexts.html<\/a><\/noindex>. \u00d6vergripande \u00e4r detta en intressant mekanism som kan till\u00e4mpas framg\u00e5ngsrikt, till exempel f\u00f6r testning. <\/li>\n<li>Den tredje v\u00e4gen best\u00e5r av flera steg. F\u00f6rst m\u00e5ste en migrering skapas f\u00f6r de redan existerande tabellerna. Sedan m\u00e5ste den till\u00e4mpas i en viss milj\u00f6 f\u00f6r att f\u00e5 dess hashv\u00e4rde. N\u00e4sta steg \u00e4r att initiera tomma Liquibase-tabeller p\u00e5 v\u00e5r icke-tomma server, och i tabellen med historik f\u00f6r till\u00e4mpade changsets kan man manuellt l\u00e4gga till en post om ett \"som om till\u00e4mpat\" changset med redan befintliga f\u00f6r\u00e4ndringar i databasen. P\u00e5 s\u00e5 s\u00e4tt b\u00f6rjar historiken p\u00e5 den redan existerande servern fr\u00e5n version 2, och alla nya milj\u00f6er kommer att bete sig identiskt.<br \/>\n<img decoding=\"async\" alt=\"Hur man undviker att skjuta sig sj\u00e4lv i foten med 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\">Situation 4. Migreringarna blir enorma och hinner inte genomf\u00f6ras<\/h3>\n<p><\/p>\n<p>I b\u00f6rjan av utvecklingen av tj\u00e4nsten anv\u00e4nds oftast Liquibase som ett externt beroende, och alla migreringar hanteras vid appens start. Men med tiden kan du st\u00f6ta p\u00e5 f\u00f6ljande fall:<\/p>\n<p><\/p>\n<ul>\n<li>Migreringarna blir enorma och tar l\u00e5ng tid att genomf\u00f6ra.<\/li>\n<li>Det uppst\u00e5r behov av migrering i distribuerade milj\u00f6er, till exempel p\u00e5 flera instanser av databasservrar samtidigt.<br \/>\nI s\u00e5dana fall kommer en alltf\u00f6r l\u00e5ng till\u00e4mpning av migreringarna att leda till timeouts vid appens start. Dessutom kan till\u00e4mpningen av migreringar f\u00f6r varje instans av applikationen separat leda till att olika servrar hamnar i ett osynkroniserat tillst\u00e5nd. <\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"kak-reshat-3\">Hur man l\u00f6ser<\/h4>\n<p><\/p>\n<p>I s\u00e5dana fall \u00e4r ditt projekt redan stort, kanske till och med vuxet, och Liquibase b\u00f6rjar fungera som ett separat externt verktyg. Anledningen \u00e4r att Liquibase som bibliotek packas i en jar-fil och kan fungera b\u00e5de som beroende inom projektet och autonomt. <\/p>\n<p><\/p>\n<p>I autonomt l\u00e4ge kan till\u00e4mpningen av migreringar l\u00e4ggas p\u00e5 din CI\/CD-milj\u00f6 eller p\u00e5 de starka axlarna hos dina systemadministrat\u00f6rer, som \u00e4r specialister p\u00e5 drifts\u00e4ttning. F\u00f6r detta beh\u00f6vs kommandoraden f\u00f6r Liquibase. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/command_line.html\">https:\/\/www.liquibase.org\/documentation\/command_line.html<\/a><\/noindex>. I det l\u00e4get finns m\u00f6jlighet att starta applikationen f\u00f6rst efter att alla n\u00f6dv\u00e4ndiga migreringar har genomf\u00f6rts.<\/p>\n<p><\/p>\n<h2 id=\"vyvod\">Utdata<\/h2>\n<p><\/p>\n<p>Det finns faktiskt m\u00e5nga fler f\u00e4llor n\u00e4r man arbetar med databasmigreringar, och m\u00e5nga av dem kr\u00e4ver ett kreativt tillv\u00e4gag\u00e5ngss\u00e4tt. Det \u00e4r viktigt att f\u00f6rst\u00e5 att om verktyget anv\u00e4nds korrekt, s\u00e5 kan de flesta av dessa f\u00e4llor undvikas. Personligen har jag i olika former st\u00f6tt p\u00e5 alla n\u00e4mnda problem, och vissa av dem har varit ett resultat av mina egna misstag. Oftast h\u00e4nder detta p\u00e5 grund av of\u00f6rsiktighet, men ibland p\u00e5 grund av en kriminell of\u00f6rm\u00e5ga att anv\u00e4nda verktyget.<\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Hur man undviker att skjuta sig sj\u00e4lv i foten n\u00e4r man anv\u00e4nder Liquibase | ProHoster","description":"Aldrig har det varit s\u00e5, och nu h\u00e4nder det igen! I ett nytt projekt beslutade vi att anv\u00e4nda Liquibase fr\u00e5n b\u00f6rjan f\u00f6r att undvika problem i framtiden.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/70973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=70973"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/70973\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/70974"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=70973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=70973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=70973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}