{"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\/cs\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","title":{"rendered":"Jak si neubl\u00ed\u017eit pomoc\u00ed Liquibase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nikdy nebylo, a je to zase tady!<\/p>\n<p><\/p>\n<p>Na dal\u0161\u00edm projektu jsme se rozhodli pou\u017e\u00edt Liquibase od sam\u00e9ho za\u010d\u00e1tku, abychom se vyhnuli probl\u00e9m\u016fm v budoucnu. Jak se uk\u00e1zalo, ne v\u0161ichni mlad\u00ed \u010dlenov\u00e9 t\u00fdmu um\u00ed spr\u00e1vn\u011b pou\u017e\u00edvat. <\/p>\n<p><\/p>\n<p>Tento \u010dl\u00e1nek obsahuje u\u017eite\u010dn\u00e9 rady a popis t\u0159\u00ed nejv\u00fdrazn\u011bj\u0161\u00edch past\u00ed, do kter\u00fdch se m\u016f\u017eete dostat p\u0159i pr\u00e1ci s n\u00e1stroji pro migraci rela\u010dn\u00edch datab\u00e1z\u00ed, konkr\u00e9tn\u011b Liquibase. Je ur\u010den pro Java v\u00fdvoj\u00e1\u0159e na \u00farovni Junior a Middle, pro zku\u0161en\u011bj\u0161\u00ed v\u00fdvoj\u00e1\u0159e m\u016f\u017ee b\u00fdt zaj\u00edmav\u00fd pro strukturalizaci a zopakov\u00e1n\u00ed toho, co pravd\u011bpodobn\u011b ji\u017e znaj\u00ed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jak si neubl\u00ed\u017eit pomoc\u00ed 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 a Flyway \u2013 hlavn\u00ed konkuren\u010dn\u00ed technologie pro \u0159e\u0161en\u00ed \u00faloh spr\u00e1vy verz\u00ed rela\u010dn\u00edch struktur ve sv\u011bt\u011b Java. Prvn\u00ed z nich je zcela zdarma a ve skute\u010dnosti se \u010dast\u011bji vyb\u00edr\u00e1 pr\u00e1v\u011b ona, proto byla Liquibase zvolena za hlavn\u00edho hrdinu t\u00e9to publikace. Nicm\u00e9n\u011b n\u011bkter\u00e9 z popsan\u00fdch praktik mohou b\u00fdt univerz\u00e1ln\u00ed, v z\u00e1vislosti na architektu\u0159e va\u0161\u00ed aplikace. <\/p>\n<p><\/p>\n<p>Migrace rela\u010dn\u00edch struktur je nutn\u00e1 metoda boje se slabou flexibilitou rela\u010dn\u00edch datov\u00fdch \u00falo\u017ei\u0161\u0165. V dob\u011b m\u00f3dy na OOP bylo pojet\u00ed pr\u00e1ce s datab\u00e1z\u00ed, \u017ee jednou pop\u00ed\u0161eme sch\u00e9ma a v\u00edce se ho nedotkneme. Ale realita je takov\u00e1, \u017ee v\u0161e se m\u011bn\u00ed a zm\u011bny ve struktu\u0159e tabulek jsou pot\u0159eba dost \u010dasto. Samoz\u0159ejm\u011b, \u017ee proces s\u00e1m o sob\u011b m\u016f\u017ee b\u00fdt bolestiv\u00fd a nep\u0159\u00edjemn\u00fd. <\/p>\n<p><\/p>\n<p>Nebudu se hloub\u011bji zab\u00fdvat popisem technologie a n\u00e1vody na p\u0159id\u00e1n\u00ed knihovny do va\u0161eho projektu, na toto t\u00e9ma bylo naps\u00e1no ji\u017e dost \u010dl\u00e1nk\u016f:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460377\/\">Pou\u017eit\u00ed Liquibase pro spr\u00e1vu struktury datab\u00e1ze ve Spring Boot aplikaci. \u010c\u00e1st 1<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460907\/\">Pou\u017eit\u00ed Liquibase pro spr\u00e1vu struktury datab\u00e1ze ve Spring Boot aplikaci. \u010c\u00e1st 2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436994\/\">Liquibase a Maven<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/330662\/\">P\u0159\u00edstupy k verzionov\u00e1n\u00ed zm\u011bn v datab\u00e1zi<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/271719\/\">Spring MVC\/Security, REST, Hibernate, Liquibase spou\u0161t\u00edme ve dvou \u0159\u00e1dc\u00edch<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Krom\u011b toho u\u017e byla skv\u011bl\u00e1 zpr\u00e1va na t\u00e9ma u\u017eite\u010dn\u00fdch rad:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/179425\/\">Pou\u017eit\u00ed Liquibase bez bolesti hlavy. 10 rad z re\u00e1ln\u00e9ho v\u00fdvoje<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sovety\">Tipy<\/h2>\n<p><\/p>\n<p>Chci se pod\u011blit o sv\u00e9 tipy a koment\u00e1\u0159e, kter\u00e9 se zrodily skrze pot, krev a bolest p\u0159i \u0159e\u0161en\u00ed probl\u00e9m\u016f s migrac\u00ed.<\/p>\n<p><\/p>\n<h3 id=\"1--pered-rabotoy-sleduet-oznakomitsya-s-razdelom-luchshih-praktik-na-saytehttpswwwliquibaseorgbestpracticeshtml-liquibase\">1. P\u0159ed prac\u00ed je dobr\u00e9 se sezn\u00e1mit s \u010d\u00e1st\u00ed nejlep\u0161\u00edch praktik na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">webu<\/a><\/noindex> Liquibase<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">Tam<\/a><\/noindex> Jsou zde pops\u00e1ny jednoduch\u00e9, ale velmi d\u016fle\u017eit\u00e9 v\u011bci, bez kter\u00fdch m\u016f\u017ee b\u00fdt pou\u017e\u00edv\u00e1n\u00ed knihovny komplikovan\u00e9. Nap\u0159\u00edklad nekoherentn\u00ed p\u0159\u00edstup k \u0159\u00edzen\u00ed change-set\u016f d\u0159\u00edve \u010di pozd\u011bji povede k zmatku a poru\u0161en\u00fdm migrac\u00edm. Pokud dojde k nasazen\u00ed z\u00e1visl\u00fdch zm\u011bn datab\u00e1zov\u00e9 struktury a logiky slu\u017eeb ne sou\u010dasn\u011b, hroz\u00ed vysok\u00e9 riziko, \u017ee to povede k chyb\u00e1m v testech nebo poru\u0161en\u00e9mu prost\u0159ed\u00ed. Krom\u011b toho doporu\u010den\u00ed k pou\u017eit\u00ed Liquibase na ofici\u00e1ln\u00edm webu obsahuj\u00ed bod o vytv\u00e1\u0159en\u00ed a ov\u011b\u0159ov\u00e1n\u00ed rollback skript\u016f spolu se z\u00e1kladn\u00edmi migra\u010dn\u00edmi skripty. A tak\u00e9 v \u010dl\u00e1nku <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/178665\/\">https:\/\/habr.com\/ru\/post\/178665\/<\/a><\/noindex> najdete p\u0159\u00edklady k\u00f3du vztahuj\u00edc\u00ed se k migrac\u00edm a mechanismu rollback. <\/p>\n<p><\/p>\n<h3 id=\"2-esli-nachali-ispolzovat-sredstva-migracii--ne-dopuskayte-manualnyh-ispravleniy-v-strukture-bazy\">2. Kdy\u017e za\u010dnete pou\u017e\u00edvat migra\u010dn\u00ed n\u00e1stroje, nedovolte manu\u00e1ln\u00ed opravy v datab\u00e1zov\u00e9 struktu\u0159e.<\/h3>\n<p><\/p>\n<p>Jak se \u0159\u00edk\u00e1: \u201eJednou Persil, nav\u017edy Persil\u201c. Pokud je datab\u00e1ze va\u0161\u00ed aplikace \u0159\u00edzena prost\u0159edky Liquibase \u2014 jak\u00e9koli ru\u010dn\u00ed zm\u011bny okam\u017eit\u011b vedou k nekonzistentn\u00edmu stavu, a \u00farove\u0148 d\u016fv\u011bry v change-sety kles\u00e1 na nulu. Potenci\u00e1ln\u00ed rizika zahrnuj\u00ed n\u011bkolik hodin str\u00e1ven\u00fdch obnovou datab\u00e1ze, v nejhor\u0161\u00edm p\u0159\u00edpad\u011b m\u016f\u017ee b\u00fdt server zni\u010den. Pokud ve va\u0161em t\u00fdmu je DBA architekt \u201estar\u00e9 \u0161koly\u201c, trp\u011bliv\u011b a zamy\u0161len\u011b mu vysv\u011btlete, jak \u0161patn\u011b to bude vypadat, pokud jednodu\u0161e uprav\u00ed datab\u00e1zi podle sv\u00e9ho uv\u00e1\u017een\u00ed v hypotetick\u00e9m SQL Developer. <\/p>\n<p><\/p>\n<h3 id=\"3-esli-chendzhset-uzhe-byl-zapushen-v-repozitoriy-izbegayte-redaktirovaniya\">3. Pokud byl change-set ji\u017e nahr\u00e1n do repozit\u00e1\u0159e, vyhn\u011bte se jeho \u00faprav\u00e1m.<\/h3>\n<p><\/p>\n<p>Pokud jin\u00fd v\u00fdvoj\u00e1\u0159 provedl pull a pou\u017eil change-set, kter\u00fd bude n\u00e1sledn\u011b upraven, ur\u010dit\u011b na v\u00e1s nezapomene dob\u0159e, kdy\u017e obdr\u017e\u00ed chybu p\u0159i spu\u0161t\u011bn\u00ed aplikace. Pokud se \u00fapravy change-setu n\u011bjak\u00fdm zp\u016fsobem dostanou do dev, budete muset j\u00edt k\u0159ivolakou cestou hotfix\u016f. Podstata probl\u00e9mu spo\u010d\u00edv\u00e1 v ov\u011b\u0159en\u00ed zm\u011bn podle hash hodnoty \u2014 hlavn\u00ed mechanismus Liquibase. P\u0159i \u00faprav\u00e1ch k\u00f3du change-setu se zm\u011bn\u00ed hash hodnota. \u00dapravy change-set\u016f jsou mo\u017en\u00e9 pouze tehdy, kdy\u017e existuje mo\u017enost bez ztr\u00e1ty dat obnovit celou datab\u00e1zi od nuly. V takov\u00e9m p\u0159\u00edpad\u011b m\u016f\u017ee refaktoring SQL nebo XML k\u00f3du naopak usnadnit \u017eivot a u\u010dinit migrace \u010diteln\u011bj\u0161\u00edmi. P\u0159\u00edkladem m\u016f\u017ee b\u00fdt situace, kdy byla na za\u010d\u00e1tku aplikace schv\u00e1len\u00e1 sch\u00e9ma p\u016fvodn\u00ed datab\u00e1ze uvnit\u0159 t\u00fdmu. <\/p>\n<p><\/p>\n<h3 id=\"4--imey-proverennye-bekapy-baz-dannyh-esli-eto-vozmozhno\">4. M\u011bj ov\u011b\u0159en\u00e9 z\u00e1lohy datab\u00e1z\u00ed, pokud je to mo\u017en\u00e9.<\/h3>\n<p><\/p>\n<p>Tady je mysl\u00edm v\u0161echno jasn\u00e9. V p\u0159\u00edpad\u011b, \u017ee by migrace nevy\u0161la, je mo\u017en\u00e9 v\u0161echno vr\u00e1tit zp\u011bt. Liquibase m\u00e1 n\u00e1stroj pro n\u00e1vrat zm\u011bn, ale skripty pro n\u00e1vrat p\u00ed\u0161e tak\u00e9 s\u00e1m v\u00fdvoj\u00e1\u0159, a v nich mohou b\u00fdt probl\u00e9my se stejnou pravd\u011bpodobnost\u00ed jako ve skriptech hlavn\u00edho changetu. To znamen\u00e1, \u017ee b\u00fdt opatrn\u00fd se z\u00e1lohami je u\u017eite\u010dn\u00e9 v ka\u017ed\u00e9m p\u0159\u00edpad\u011b. <\/p>\n<p><\/p>\n<h3 id=\"5-ispolzuy-proverennye-bekapy-baz-dannyh-v-razrabotke-esli-eto-vozmozhno\">5. Pou\u017e\u00edvej ov\u011b\u0159en\u00e9 z\u00e1lohy datab\u00e1z\u00ed ve v\u00fdvoji, pokud to je mo\u017en\u00e9.<\/h3>\n<p><\/p>\n<p>Pokud to nen\u00ed v rozporu se smlouvami a ochranou soukrom\u00ed, v datab\u00e1zi nejsou osobn\u00ed \u00fadaje a nev\u00e1\u017e\u00ed jako dv\u011b slunce \u2014 p\u0159ed aplikac\u00ed migrac\u00ed na \u017eiv\u00fdch serverech lze ov\u011b\u0159it, jak to funguje na stroji v\u00fdvoj\u00e1\u0159e, a spo\u010d\u00edtat t\u00e9m\u011b\u0159 100% potenci\u00e1ln\u00edch probl\u00e9m\u016f p\u0159i migraci. <\/p>\n<p><\/p>\n<h3 id=\"6-obschaysya-s-drugimi-razrabotchikami-v-komande\">6. Komunikuj s ostatn\u00edmi v\u00fdvoj\u00e1\u0159i v t\u00fdmu.<\/h3>\n<p><\/p>\n<p>V dob\u0159e organizovan\u00e9m v\u00fdvojov\u00e9m procesu v\u0161ichni v t\u00fdmu v\u011bd\u00ed, kdo se \u010d\u00edm zab\u00fdv\u00e1. V praxi to v\u0161ak \u010dasto nen\u00ed tak, proto je \u017e\u00e1douc\u00ed, abys, pokud p\u0159ipravuje\u0161 zm\u011bny ve struktu\u0159e datab\u00e1ze, nav\u00edc informoval cel\u00fd t\u00fdm. Pokud n\u011bkdo prov\u00e1d\u00ed zm\u011bny paraleln\u011b \u2014 m\u011bl bys se opatrn\u011b organizovat. Je dobr\u00e9 komunikovat s kolegy i po dokon\u010den\u00ed pr\u00e1ce, ne pouze na za\u010d\u00e1tku. Mnoho potenci\u00e1ln\u00edch probl\u00e9m\u016f s changety se m\u016f\u017ee vy\u0159e\u0161it b\u011bhem code review. <\/p>\n<p><\/p>\n<h3 id=\"7-dumay-chto-delaesh\">7. P\u0159em\u00fd\u0161lej, co d\u011bl\u00e1\u0161!<\/h3>\n<p><\/p>\n<p>Zd\u00e1 se to jako samoz\u0159ejm\u00fd rada platn\u00e1 pro jakoukoli situaci. Nicm\u00e9n\u011b mnoha probl\u00e9m\u016fm by se dalo vyhnout, kdyby v\u00fdvoj\u00e1\u0159 je\u0161t\u011b jednou analyzoval, co d\u011bl\u00e1 a jak to m\u016f\u017ee ovlivnit. Pr\u00e1ce s migracemi v\u017edy vy\u017eaduje zv\u00fd\u0161enou pozornost a preciznost. <\/p>\n<p><\/p>\n<h2 id=\"lovushki\">Past<\/h2>\n<p><\/p>\n<p>Poj\u010fme se nyn\u00ed pod\u00edvat na typick\u00e9 pasti, do kter\u00fdch se m\u016f\u017eete dostat, pokud nebudete n\u00e1sledovat v\u00fd\u0161e uveden\u00e9 rady, a co vlastn\u011b d\u011blat?<\/p>\n<p><\/p>\n<h3 id=\"situaciya-1-dva-razrabotchika-pytayutsya-odnovremenno-dobavlyat-novye-chendzhsety\">Situace 1. Dva v\u00fdvoj\u00e1\u0159i se pokou\u0161ej\u00ed sou\u010dasn\u011b p\u0159id\u00e1vat nov\u00e9 changety.<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jak si neubl\u00ed\u017eit pomoc\u00ed Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/20706fc970510bc06634fa001a4c7ceb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u00e1\u0161a a Petya cht\u011bj\u00ed vytvo\u0159it changet verze 4, ani\u017e by o sob\u011b v\u011bd\u011bli. U\u010dinili zm\u011bny ve struktu\u0159e datab\u00e1ze a zaslali pull request s r\u016fzn\u00fdmi soubory changet\u016f. D\u00e1le je navrhov\u00e1n n\u00e1sleduj\u00edc\u00ed mechanismus postupu:<\/p>\n<p><\/p>\n<h4 id=\"kak-reshat\">Jak \u0159e\u0161it<\/h4>\n<p><\/p>\n<ol>\n<li>N\u011bjak\u00fdm zp\u016fsobem se kolegov\u00e9 mus\u00ed dohodnout, v jak\u00e9m po\u0159ad\u00ed maj\u00ed jejich changety j\u00edt, p\u0159edpokl\u00e1dejme, \u017ee Petin by m\u011bl b\u00fdt aplikov\u00e1n jako prvn\u00ed. <\/li>\n<li>N\u011bkdo by m\u011bl p\u0159idat druhou ke sv\u00e9mu a ozna\u010dit chageSet Va\u0161i verz\u00ed 5. To lze prov\u00e9st pomoc\u00ed Cherry Pick nebo pe\u010dliv\u00fdm slou\u010den\u00edm. <\/li>\n<li>Po zm\u011bn\u00e1ch je v\u017edy nutn\u00e9 zkontrolovat platnost proveden\u00fdch akc\u00ed.<br \/>\nVe skute\u010dnosti mechanismy Liquibase umo\u017e\u0148uj\u00ed m\u00edt v repozit\u00e1\u0159i dva changeSety verze 4, tak\u017ee je mo\u017en\u00e9 nechat v\u0161e tak, jak to je. To znamen\u00e1, \u017ee budete m\u00edt prost\u011b dv\u011b zm\u011bny verze 4 s r\u016fzn\u00fdmi n\u00e1zvy. P\u0159i takov\u00e9m p\u0159\u00edstupu je pozd\u011bji v verz\u00edch datab\u00e1ze velmi obt\u00ed\u017en\u00e9 se orientovat. <\/li>\n<\/ol>\n<p><\/p>\n<p>Krom\u011b toho, Liquibase, jak u hobit\u016f doma, ukr\u00fdv\u00e1 mnoho tajemstv\u00ed. Jedn\u00edm z nich je kl\u00ed\u010d validCheckSum, kter\u00fd se objevil ve verzi 1.7 a umo\u017e\u0148uje uv\u00e9st platnou hodnotu hash sou\u010dtu pro konkr\u00e9tn\u00ed changeSet, bez ohledu na to, co je ulo\u017eeno v datab\u00e1zi. Dokumentace <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/changeset.html\">https:\/\/www.liquibase.org\/documentation\/changeset.html<\/a><\/noindex> \u0159\u00edk\u00e1 n\u00e1sleduj\u00edc\u00ed:<\/p>\n<p><\/p>\n<blockquote><p>P\u0159idejte kontroln\u00ed sou\u010det, kter\u00fd se pova\u017euje za platn\u00fd pro tuto sadu zm\u011bn, bez ohledu na to, co je ulo\u017eeno v datab\u00e1zi. Pou\u017e\u00edv\u00e1 se p\u0159edev\u0161\u00edm tehdy, kdy\u017e pot\u0159ebujete zm\u011bnit sadu zm\u011bn a nechcete, aby se na datab\u00e1z\u00edch, na kter\u00fdch ji\u017e b\u011b\u017eela, objevily chyby (nen\u00ed to doporu\u010den\u00fd postup).<\/p><\/blockquote>\n<p>Ano, takov\u00fd postup se nedoporu\u010duje. Ale n\u011bkdy mocn\u00fd sv\u011btl\u00fd \u010darod\u011bj ovl\u00e1d\u00e1 tak\u00e9 temn\u00e9 techniky. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-2-migraciya-kotoraya-zavisit-ot-dannyh\">Situace 2. Migrace, kter\u00e1 z\u00e1vis\u00ed na datech.<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jak si neubl\u00ed\u017eit pomoc\u00ed Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/31a6eebb55278c0631115bf16483c7b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u0159edstavte si, \u017ee nem\u00e1te mo\u017enost pou\u017e\u00edt z\u00e1lohy datab\u00e1z\u00ed z \u017eiv\u00fdch server\u016f. Pjotr vytvo\u0159il changeSet, zkontroloval ho lok\u00e1ln\u011b a s naprostou jistotou sv\u00e9 pravdy ud\u011blal pull request do v\u00fdvoje. Vedouc\u00ed projektu pro jistotu up\u0159esnil, zda ho Pjotr zkontroloval, a pot\u00e9 slou\u010dil. Ale nasazen\u00ed na v\u00fdvojov\u00e9m serveru selhalo.<\/p>\n<p><\/p>\n<p>Ve skute\u010dnosti je to mo\u017en\u00e9 a nikdo nen\u00ed p\u0159ed t\u00edm chr\u00e1n\u011bn. K tomu doch\u00e1z\u00ed, pokud jsou modifikace struktury tabulek n\u011bjak\u00fdm zp\u016fsobem v\u00e1z\u00e1ny na konkr\u00e9tn\u00ed data z datab\u00e1ze. Je z\u0159ejm\u00e9, \u017ee pokud je Pjotrova datab\u00e1ze napln\u011bna pouze testovac\u00edmi daty, nemus\u00ed pokr\u00fdt v\u0161echny problematick\u00e9 p\u0159\u00edpady. Nap\u0159\u00edklad p\u0159i odstra\u0148ov\u00e1n\u00ed tabulky se ukazuje, \u017ee existuj\u00ed z\u00e1znamy v jin\u00fdch tabulk\u00e1ch podle ciz\u00edho kl\u00ed\u010de souvisej\u00edc\u00ed se z\u00e1znamy v odstra\u0148ovan\u00e9 tabulce. Nebo p\u0159i zm\u011bn\u011b typu sloupce se ukazuje, \u017ee ne 100 % dat m\u016f\u017ee b\u00fdt p\u0159evedeno na nov\u00fd typ. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-1\">Jak \u0159e\u0161it<\/h4>\n<p><\/p>\n<ul>\n<li>Napsat speci\u00e1ln\u00ed skripty, kter\u00e9 budou jednor\u00e1zov\u011b pou\u017eity spolu s migrac\u00ed a uvedou data do po\u017eadovan\u00e9ho stavu. Toto je obecn\u00fd zp\u016fsob \u0159e\u0161en\u00ed probl\u00e9mu p\u0159enosu dat do nov\u00fdch struktur ji\u017e po aplikaci migrac\u00ed, ale n\u011bco podobn\u00e9ho m\u016f\u017ee b\u00fdt pou\u017eito i p\u0159edt\u00edm, v n\u011bkter\u00fdch p\u0159\u00edpadech. Takov\u00fd zp\u016fsob, samoz\u0159ejm\u011b, nen\u00ed v\u017edy dostupn\u00fd, nebo\u0165 editace dat na \u017eiv\u00fdch serverech m\u016f\u017ee b\u00fdt nebezpe\u010dn\u00e1 a dokonce destruktivn\u00ed. <\/li>\n<li>Dal\u0161\u00ed slo\u017eitou cestou je upravit existuj\u00edc\u00ed changset. Slo\u017eitost spo\u010d\u00edv\u00e1 v tom, \u017ee v\u0161echny datab\u00e1ze, kde byl v existuj\u00edc\u00edm stavu ji\u017e aplikov\u00e1n, bude nutn\u00e9 obnovit. Je docela mo\u017en\u00e9, \u017ee cel\u00e1 backendov\u00e1 skupina bude nucena lok\u00e1ln\u011b obnovit datab\u00e1zi od za\u010d\u00e1tku. <\/li>\n<li>A nejuniverz\u00e1ln\u011bj\u0161\u00ed cesta je p\u0159en\u00e9st probl\u00e9m s daty na prost\u0159ed\u00ed v\u00fdvoj\u00e1\u0159e s rekonstrukc\u00ed stejn\u00e9 situace a p\u0159idat nov\u00fd changset, a\u017e k po\u0161kozen\u00e9mu, kter\u00fd umo\u017en\u00ed probl\u00e9m obej\u00edt.<br \/>\n<img decoding=\"async\" alt=\"Jak si neubl\u00ed\u017eit pomoc\u00ed Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/b5d28a940a7a35b6cd7a819a8e68f027.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>Obecn\u011b plat\u00ed, \u010d\u00edm v\u00edce se datab\u00e1ze po slo\u017een\u00ed dat podob\u00e1 datab\u00e1zi produk\u010dn\u00edho serveru, t\u00edm men\u0161\u00ed je \u0161ance, \u017ee probl\u00e9my s migracemi prob\u011bhnou daleko. A samoz\u0159ejm\u011b, ne\u017e po\u0161lete changset do repozit\u00e1\u0159e, stoj\u00ed za to n\u011bkolikr\u00e1t zv\u00e1\u017eit, zda n\u011bco neporu\u0161\u00ed. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-3-liquibase-nachinaet-primenyatsya-uzhe-posle-vyhoda-v-prodakshn\">Situace 3. Liquibase za\u010d\u00edn\u00e1 b\u00fdt aplikov\u00e1n a\u017e po uveden\u00ed do produkce<\/h3>\n<p><\/p>\n<p>P\u0159edpokl\u00e1dejme, \u017ee t\u00fdmov\u00fd vedouc\u00ed po\u017e\u00e1dal Petu, aby do projektu p\u0159ipojil Liquibase, av\u0161ak projekt ji\u017e je v produkci a m\u00e1 ji\u017e existuj\u00edc\u00ed strukturu datab\u00e1ze.<\/p>\n<p><\/p>\n<p>Tedy probl\u00e9m spo\u010d\u00edv\u00e1 v tom, \u017ee na jak\u00fdchkoli nov\u00fdch serverech nebo stroj\u00edch v\u00fdvoj\u00e1\u0159\u016f mus\u00ed b\u00fdt tabulky znovu vytvo\u0159eny od nuly, a ji\u017e existuj\u00edc\u00ed prost\u0159ed\u00ed by m\u011blo z\u016fstat v konzistentn\u00edm stavu a b\u00fdt p\u0159ipraveno p\u0159ij\u00edmat nov\u00e9 changsety. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-2\">Jak \u0159e\u0161it<\/h4>\n<p><\/p>\n<p>Zde je tak\u00e9 n\u011bkolik cest:<\/p>\n<p><\/p>\n<ul>\n<li>Prvn\u00ed a nejv\u00edce z\u0159ejm\u00e1 \u2014 m\u00edt samostatn\u00fd skript, kter\u00fd mus\u00ed b\u00fdt ru\u010dn\u011b aplikov\u00e1n p\u0159i inicializaci nov\u00e9ho prost\u0159ed\u00ed. <\/li>\n<li>Druh\u00e1 \u2014 m\u00e9n\u011b z\u0159ejm\u00e1, m\u00edt Liquibase migraci, kter\u00e1 se nach\u00e1z\u00ed v jin\u00e9m Liquibase kontextu, a aplikovat ji. Podrobn\u011bji o Liquibase kontextu si m\u016f\u017eete p\u0159e\u010d\u00edst zde: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/contexts.html\">https:\/\/www.liquibase.org\/documentation\/contexts.html<\/a><\/noindex>. Obecn\u011b je to zaj\u00edmav\u00fd mechanismus, kter\u00fd m\u016f\u017ee b\u00fdt \u00fasp\u011b\u0161n\u011b pou\u017eit, nap\u0159\u00edklad pro testov\u00e1n\u00ed. <\/li>\n<li>T\u0159et\u00ed cesta se skl\u00e1d\u00e1 z n\u011bkolika krok\u016f. Nejprve je t\u0159eba vytvo\u0159it migraci pro ji\u017e existuj\u00edc\u00ed tabulky. Pot\u00e9 by m\u011bla b\u00fdt aplikov\u00e1na na n\u011bjak\u00e9m prost\u0159ed\u00ed, \u010d\u00edm\u017e se z\u00edsk\u00e1 jej\u00ed hash. Dal\u0161\u00edm krokem je inicializace pr\u00e1zdn\u00fdch tabulek Liquibase na na\u0161em nepust\u00e9m serveru a do tabulky s histori\u00ed aplikace changelistu lze manu\u00e1ln\u011b vlo\u017eit z\u00e1znam o \"jakoby aplikovan\u00e9m\" changelistu se zm\u011bnami, kter\u00e9 ji\u017e jsou v datab\u00e1zi. T\u00edmto zp\u016fsobem na ji\u017e existuj\u00edc\u00edm serveru za\u010dne historie s verz\u00ed 2 a v\u0161echna nov\u00e1 prost\u0159ed\u00ed se budou chovat identicky.<br \/>\n<img decoding=\"async\" alt=\"Jak si neubl\u00ed\u017eit pomoc\u00ed 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\">Situace 4. Migrace se st\u00e1vaj\u00ed obrovsk\u00fdmi a nest\u00edhaj\u00ed se prov\u00e1d\u011bt.<\/h3>\n<p><\/p>\n<p>Na za\u010d\u00e1tku v\u00fdvoje slu\u017eby se obvykle Liquibase pou\u017e\u00edv\u00e1 jako extern\u00ed z\u00e1vislost a v\u0161echny migrace se zpracov\u00e1vaj\u00ed p\u0159i spu\u0161t\u011bn\u00ed aplikace. Nicm\u00e9n\u011b \u010dasem se m\u016f\u017eete setkat s n\u00e1sleduj\u00edc\u00edmi sc\u00e9n\u00e1\u0159i:<\/p>\n<p><\/p>\n<ul>\n<li>Migrace se st\u00e1vaj\u00ed obrovsk\u00fdmi a prov\u00e1d\u011bj\u00ed se dlouhou dobu.<\/li>\n<li>Objevuje se pot\u0159eba migrace v distribuovan\u00fdch prost\u0159ed\u00edch, nap\u0159\u00edklad na n\u011bkolika instanc\u00edch datab\u00e1zov\u00fdch server\u016f sou\u010dasn\u011b.<br \/>\nV takov\u00e9m p\u0159\u00edpad\u011b p\u0159\u00edli\u0161 dlouh\u00e9 pou\u017eit\u00ed migrac\u00ed povede k timeoutu p\u0159i spu\u0161t\u011bn\u00ed aplikace. Krom\u011b toho m\u016f\u017ee pou\u017eit\u00ed migrac\u00ed pro ka\u017edou instanci aplikace zvl\u00e1\u0161\u0165 v\u00e9st k tomu, \u017ee r\u016fzn\u00e9 servery se ocitnou v nesynchronizovan\u00e9m stavu. <\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"kak-reshat-3\">Jak \u0159e\u0161it<\/h4>\n<p><\/p>\n<p>V takov\u00fdch p\u0159\u00edpadech je v\u00e1\u0161 projekt ji\u017e velk\u00fd, mo\u017en\u00e1 dokonce dosp\u011bl\u00fd, a Liquibase za\u010d\u00edn\u00e1 fungovat jako samostatn\u00fd extern\u00ed n\u00e1stroj. Faktem je, \u017ee Liquibase jako knihovna se sestavuje do jar souboru a m\u016f\u017ee fungovat jak jako z\u00e1vislost uvnit\u0159 projektu, tak i autonomn\u011b. <\/p>\n<p><\/p>\n<p>V autonomn\u00edm re\u017eimu lze pou\u017eit\u00ed migrac\u00ed p\u0159enechat va\u0161\u00ed CI\/CD prost\u0159ed\u00ed nebo na siln\u00e1 ramena va\u0161ich syst\u00e9mov\u00fdch administr\u00e1tor\u016f specialist\u016f na nasazen\u00ed. K tomu je t\u0159eba p\u0159\u00edkazov\u00e9ho \u0159\u00e1dku Liquibase. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/command_line.html\">https:\/\/www.liquibase.org\/documentation\/command_line.html<\/a><\/noindex>. V tomto re\u017eimu je mo\u017en\u00e9 spustit aplikaci a\u017e pot\u00e9, co byly provedeny v\u0161echny pot\u0159ebn\u00e9 migrace.<\/p>\n<p><\/p>\n<h2 id=\"vyvod\">V\u00fdstup<\/h2>\n<p><\/p>\n<p>P\u0159i pr\u00e1ci s migracemi datab\u00e1z\u00ed mohou existovat mnohem v\u00edce n\u00e1strah, a mnoh\u00e9 z nich vy\u017eaduj\u00ed kreativn\u00ed p\u0159\u00edstup. Je d\u016fle\u017eit\u00e9 ch\u00e1pat, \u017ee pokud se n\u00e1stroj pou\u017e\u00edv\u00e1 spr\u00e1vn\u011b, v\u011bt\u0161ina t\u011bchto n\u00e1strah se d\u00e1 vyhnout. Osobn\u011b jsem se ve sv\u00fdch r\u016fzn\u00fdch zku\u0161enostech setkal se v\u0161emi uveden\u00fdmi probl\u00e9my, z nich\u017e n\u011bkter\u00e9 byly v\u00fdsledkem m\u00fdch vlastn\u00edch chyb. V\u011bt\u0161inou to samoz\u0159ejm\u011b vznik\u00e1 z nedbalosti, ale n\u011bkdy - z d\u016fvodu trestuhodn\u00e9 neznalosti pou\u017eit\u00ed n\u00e1stroje.<\/p>\n<p>Zdroj: <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.3 - 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\/cs\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Jak se ne\u0161\u0165astn\u011b ne\u0161varit pomoc\u00ed Liquibase | ProHoster","description":"Nikdy to nebylo, a je to tady znovu! V dal\u0161\u00edm projektu jsme se rozhodli pou\u017e\u00edt Liquibase od sam\u00e9ho za\u010d\u00e1tku, abychom se vyhnuli probl\u00e9m\u016fm v budoucnu.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/70973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=70973"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/70973\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/70974"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=70973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=70973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=70973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}