{"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\/pt\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","title":{"rendered":"Como n\u00e3o cometer erros ao usar o Liquibase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nunca aconteceu antes, e aqui estamos de novo!<\/p>\n<p><\/p>\n<p>Em um projeto recente, decidimos utilizar o Liquibase desde o in\u00edcio para evitar problemas no futuro. Como se revelou, nem todos os novos membros da equipe sabem utiliz\u00e1-lo corretamente. Eu realizei um workshop interno e, em seguida, decidi transform\u00e1-lo em um artigo. <\/p>\n<p><\/p>\n<p>O artigo inclui dicas \u00fateis e uma descri\u00e7\u00e3o das tr\u00eas armadilhas mais evidentes nas quais se pode cair ao trabalhar com ferramentas de migra\u00e7\u00e3o de bancos de dados relacionais, especialmente o Liquibase. \u00c9 direcionado a desenvolvedores Java de n\u00edvel J\u00fanior e M\u00e9dio; para desenvolvedores mais experientes, pode ser interessante para estruturar e revisar o que provavelmente j\u00e1 \u00e9 conhecido. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Como n\u00e3o cometer erros ao usar o 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 e Flyway s\u00e3o as principais tecnologias concorrentes para o controle de vers\u00f5es de estruturas relacionais no mundo Java. A primeira \u00e9 completamente gratuita e, na pr\u00e1tica, \u00e9 frequentemente escolhida para uso, portanto, o Liquibase \u00e9 o protagonista desta publica\u00e7\u00e3o. No entanto, algumas das pr\u00e1ticas descritas podem ser universais, dependendo da arquitetura do seu aplicativo. <\/p>\n<p><\/p>\n<p>As migra\u00e7\u00f5es de estruturas relacionais surgiram como uma solu\u00e7\u00e3o necess\u00e1ria para combater a baixa flexibilidade dos reposit\u00f3rios de dados relacionais. Na era da programa\u00e7\u00e3o orientada a objetos, o trabalho com bancos de dados implicava descrever um esquema uma \u00fanica vez e n\u00e3o alter\u00e1-lo mais. Contudo, a realidade \u00e9 que tudo muda, e altera\u00e7\u00f5es na estrutura das tabelas s\u00e3o frequentemente necess\u00e1rias. Naturalmente, esse processo pode ser doloroso e desagrad\u00e1vel. <\/p>\n<p><\/p>\n<p>N\u00e3o vou me aprofundar na descri\u00e7\u00e3o da tecnologia e nas instru\u00e7\u00f5es sobre como adicionar a biblioteca ao seu projeto, sobre esse assunto j\u00e1 foram escritos artigos suficientes:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460377\/\">Usando o Liquibase para gerenciar a estrutura do banco de dados em uma aplica\u00e7\u00e3o Spring Boot. Parte 1<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460907\/\">Usando o Liquibase para gerenciar a estrutura do banco de dados em uma aplica\u00e7\u00e3o Spring Boot. Parte 2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436994\/\">Liquibase e Maven<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/330662\/\">Abordagens para versionamento de altera\u00e7\u00f5es no banco de dados<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/271719\/\">Spring MVC\/Security, REST, Hibernate, Liquibase iniciamos em duas linhas<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Al\u00e9m disso, j\u00e1 houve um \u00f3timo artigo sobre dicas \u00fateis:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/179425\/\">Usando o Liquibase sem dores de cabe\u00e7a. 10 dicas da experi\u00eancia real de desenvolvimento<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sovety\">Dicas<\/h2>\n<p><\/p>\n<p>Quero compartilhar meus conselhos e coment\u00e1rios que nasceram atrav\u00e9s do suor, sangue e dor ao resolver problemas de migra\u00e7\u00e3o.<\/p>\n<p><\/p>\n<h3 id=\"1--pered-rabotoy-sleduet-oznakomitsya-s-razdelom-luchshih-praktik-na-saytehttpswwwliquibaseorgbestpracticeshtml-liquibase\">1. Antes de come\u00e7ar, \u00e9 importante ler a se\u00e7\u00e3o de melhores pr\u00e1ticas. <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\">L\u00e1<\/a><\/noindex> est\u00e3o descritas coisas simples, mas muito importantes, sem as quais o uso da biblioteca pode complicar sua vida. Por exemplo, uma abordagem n\u00e3o estruturada para gerenciar changsets, cedo ou tarde, levar\u00e1 a confus\u00f5es e migra\u00e7\u00f5es quebradas. Se altera\u00e7\u00f5es no esquema do banco de dados e na l\u00f3gica dos servi\u00e7os n\u00e3o forem lan\u00e7adas simultaneamente, h\u00e1 uma grande probabilidade de que isso resulte em testes quebrados ou em um ambiente corrompido. Al\u00e9m disso, as recomenda\u00e7\u00f5es para o uso do Liquibase no site oficial incluem um item sobre desenvolver e testar scripts de rollback junto com os scripts principais de migra\u00e7\u00e3o. E no artigo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/178665\/\">https:\/\/habr.com\/ru\/post\/178665\/<\/a><\/noindex> existem exemplos de c\u00f3digo relacionados a migra\u00e7\u00f5es e ao mecanismo de rollback. <\/p>\n<p><\/p>\n<h3 id=\"2-esli-nachali-ispolzovat-sredstva-migracii--ne-dopuskayte-manualnyh-ispravleniy-v-strukture-bazy\">2. Se voc\u00ea come\u00e7ou a usar ferramentas de migra\u00e7\u00e3o \u2013 n\u00e3o permita altera\u00e7\u00f5es manuais na estrutura do banco de dados<\/h3>\n<p><\/p>\n<p>Como se costuma dizer: \u201cUma vez Persil \u2014 sempre Persil\u201d. Se o banco de dados da sua aplica\u00e7\u00e3o come\u00e7ou a ser gerenciado pelas ferramentas Liquibase \u2014 quaisquer altera\u00e7\u00f5es manuais instantaneamente resultam em um estado inconsistente, e o n\u00edvel de confian\u00e7a nos changsets se torna igual a zero. Os riscos potenciais incluem v\u00e1rias horas desperdi\u00e7adas na recupera\u00e7\u00e3o do banco de dados e, na pior das hip\u00f3teses, um servidor danificado. Se na sua equipe houver um DBA Architect da \u2018antiga guarda\u2019, explique pacientemente e com reflex\u00e3o como tudo ficar\u00e1 ruim se ele simplesmente editar o banco a seu crit\u00e9rio no SQL Developer. <\/p>\n<p><\/p>\n<h3 id=\"3-esli-chendzhset-uzhe-byl-zapushen-v-repozitoriy-izbegayte-redaktirovaniya\">3. Se o changset j\u00e1 foi enviado para o reposit\u00f3rio, evite edi\u00e7\u00f5es<\/h3>\n<p><\/p>\n<p>Se outro desenvolvedor fizer pull e aplicar um changset que, por sua vez, ser\u00e1 editado \u2014 ele certamente mencionar\u00e1 voc\u00ea com boas palavras quando receber um erro ao iniciar a aplica\u00e7\u00e3o. Se a edi\u00e7\u00e3o do changset vazar de alguma forma para o desenvolvimento \u2014 ser\u00e1 necess\u00e1rio percorrer um caminho escorregadio de hotfixes. O cerne do problema gira em torno da valida\u00e7\u00e3o das mudan\u00e7as por hash \u2013 o mecanismo principal do Liquibase. Ao editar o c\u00f3digo do changset, o hash muda. A edi\u00e7\u00e3o de changsets s\u00f3 \u00e9 poss\u00edvel quando existe a possibilidade de implantar todo o banco do zero sem perda de dados. Nesse caso, o refatoramento do c\u00f3digo SQL ou XML pode, ao contr\u00e1rio, facilitar a vida, tornando as migra\u00e7\u00f5es mais leg\u00edveis. Um exemplo pode ser a situa\u00e7\u00e3o em que, ao iniciar a aplica\u00e7\u00e3o, o esquema do banco de dados original foi acertado internamente na equipe. <\/p>\n<p><\/p>\n<h3 id=\"4--imey-proverennye-bekapy-baz-dannyh-esli-eto-vozmozhno\">4. Tenha backups de banco de dados verificados, se poss\u00edvel<\/h3>\n<p><\/p>\n<p>Aqui, creio que tudo est\u00e1 claro. Caso a migra\u00e7\u00e3o falhe, tudo pode ser revertido. O Liquibase possui uma ferramenta para reverter altera\u00e7\u00f5es, mas os scripts de revers\u00e3o tamb\u00e9m s\u00e3o escritos pelo desenvolvedor, e estes podem ter problemas com a mesma probabilidade que os scripts do conjunto de altera\u00e7\u00f5es principal. Isso significa que \u00e9 sempre \u00fatil contar com backups. <\/p>\n<p><\/p>\n<h3 id=\"5-ispolzuy-proverennye-bekapy-baz-dannyh-v-razrabotke-esli-eto-vozmozhno\">5. Utilize backups de banco de dados verificados no desenvolvimento, se poss\u00edvel<\/h3>\n<p><\/p>\n<p>Se isso n\u00e3o contrariar contratos e privacidade, se o banco n\u00e3o cont\u00e9m dados pessoais e n\u00e3o \u00e9 t\u00e3o pesado quanto dois s\u00f3is \u2014 antes de aplicar migra\u00e7\u00f5es em servidores ativos, \u00e9 poss\u00edvel verificar como funcionar\u00e1 na m\u00e1quina do desenvolvedor e identificar quase 100% dos problemas potenciais na migra\u00e7\u00e3o. <\/p>\n<p><\/p>\n<h3 id=\"6-obschaysya-s-drugimi-razrabotchikami-v-komande\">6. Comunique-se com outros desenvolvedores da equipe<\/h3>\n<p><\/p>\n<p>Em um processo de desenvolvimento bem organizado, todos na equipe sabem quem est\u00e1 fazendo o qu\u00ea. Na realidade, muitas vezes isso n\u00e3o acontece, portanto, se voc\u00ea estiver preparando altera\u00e7\u00f5es na estrutura do banco de dados para sua tarefa, \u00e9 aconselh\u00e1vel informar toda a equipe sobre isso. Se algu\u00e9m estiver fazendo altera\u00e7\u00f5es paralelamente, voc\u00ea deve se organizar cuidadosamente. Vale a pena manter a comunica\u00e7\u00e3o com os colegas tamb\u00e9m ap\u00f3s a conclus\u00e3o do trabalho, n\u00e3o apenas no in\u00edcio. Muitos problemas potenciais com conjuntos de altera\u00e7\u00f5es podem ser resolvidos na fase de revis\u00e3o de c\u00f3digo. <\/p>\n<p><\/p>\n<h3 id=\"7-dumay-chto-delaesh\">7. Pense no que voc\u00ea est\u00e1 fazendo!<\/h3>\n<p><\/p>\n<p>\u00c0 primeira vista, \u00e9 um conselho \u00f3bvio, aplic\u00e1vel a qualquer situa\u00e7\u00e3o. No entanto, muitos problemas poderiam ser evitados se o desenvolvedor analisasse novamente o que est\u00e1 fazendo e como isso pode impactar. Trabalhar com migra\u00e7\u00f5es sempre exige aten\u00e7\u00e3o e cuidado adicionais. <\/p>\n<p><\/p>\n<h2 id=\"lovushki\">Armadilhas<\/h2>\n<p><\/p>\n<p>Agora, vamos considerar as armadilhas t\u00edpicas nas quais se pode cair se n\u00e3o seguir as dicas acima, e o que, na verdade, fazer?<\/p>\n<p><\/p>\n<h3 id=\"situaciya-1-dva-razrabotchika-pytayutsya-odnovremenno-dobavlyat-novye-chendzhsety\">Situa\u00e7\u00e3o 1. Dois desenvolvedores tentam adicionar novos conjuntos de altera\u00e7\u00f5es ao mesmo tempo<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Como n\u00e3o cometer erros ao usar o Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/20706fc970510bc06634fa001a4c7ceb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u00e1fya e Petya querem criar o conjunto de altera\u00e7\u00f5es da vers\u00e3o 4, sem saber um do outro. Eles fizeram altera\u00e7\u00f5es na estrutura do banco de dados e submeteram pull requests com arquivos de conjuntos de altera\u00e7\u00f5es diferentes. Em seguida, \u00e9 proposto o seguinte mecanismo de a\u00e7\u00f5es:<\/p>\n<p><\/p>\n<h4 id=\"kak-reshat\">Como resolver<\/h4>\n<p><\/p>\n<ol>\n<li>De alguma forma, os colegas devem concordar sobre a ordem em que seus conjuntos de altera\u00e7\u00f5es devem ser aplicados, digamos, o de Petya deve ser aplicado primeiro. <\/li>\n<li>Algu\u00e9m deve adicionar o segundo a si mesmo e marcar o changset do Vasya com a vers\u00e3o 5. Isso pode ser feito atrav\u00e9s de Cherry Pick ou um merge cuidadoso. <\/li>\n<li>Ap\u00f3s as altera\u00e7\u00f5es, \u00e9 essencial verificar a validade das a\u00e7\u00f5es realizadas.<br \/>\nNa verdade, os mecanismos do Liquibase permitem ter dois changsets na vers\u00e3o 4 no reposit\u00f3rio, portanto, voc\u00ea pode deixar tudo como est\u00e1. Ou seja, voc\u00ea ter\u00e1 duas altera\u00e7\u00f5es na vers\u00e3o 4 com nomes diferentes. Com essa abordagem, torna-se muito dif\u00edcil navegar posteriormente pelas vers\u00f5es do banco de dados. <\/li>\n<\/ol>\n<p><\/p>\n<p>Al\u00e9m disso, o Liquibase, como a casa dos hobbits, guarda muitos segredos. Um deles \u00e9 a chave validCheckSum, que surgiu na vers\u00e3o 1.7 e permite definir um valor de hash v\u00e1lido para um changset espec\u00edfico, independentemente do que est\u00e1 armazenado no banco de dados. Documenta\u00e7\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/changeset.html\">https:\/\/www.liquibase.org\/documentation\/changeset.html<\/a><\/noindex> diz o seguinte:<\/p>\n<p><\/p>\n<blockquote><p>Adicione uma soma de verifica\u00e7\u00e3o que \u00e9 considerada v\u00e1lida para este conjunto de altera\u00e7\u00f5es, independentemente do que est\u00e1 armazenado no banco de dados. Usada principalmente quando voc\u00ea precisa modificar um conjunto de altera\u00e7\u00f5es e n\u00e3o quer que erros sejam gerados em bancos de dados nos quais ele j\u00e1 foi executado (n\u00e3o \u00e9 um procedimento recomendado).<\/p><\/blockquote>\n<p>Sim, esse procedimento n\u00e3o \u00e9 recomendado. Mas \u00e0s vezes, um poderoso mago claro domina tamb\u00e9m as t\u00e9cnicas obscuras. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-2-migraciya-kotoraya-zavisit-ot-dannyh\">Situa\u00e7\u00e3o 2. Migra\u00e7\u00e3o que depende de dados<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Como n\u00e3o cometer erros ao usar o Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/31a6eebb55278c0631115bf16483c7b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Suponha que voc\u00ea n\u00e3o tenha a possibilidade de usar backups de bancos de dados de servidores ativos. O Petya criou um changset, testou localmente e, com total certeza sobre sua corre\u00e7\u00e3o, fez um pull request no desenvolvedor. O l\u00edder do projeto, por precau\u00e7\u00e3o, esclareceu se Petya havia verificado, e ent\u00e3o ele foi mesclado. Mas o deployment no servidor de desenvolvimento falhou.<\/p>\n<p><\/p>\n<p>Na verdade, isso \u00e9 poss\u00edvel, e ningu\u00e9m est\u00e1 imune a isso. Isso acontece quando as modifica\u00e7\u00f5es na estrutura das tabelas de alguma forma est\u00e3o ligadas a dados espec\u00edficos no banco de dados. \u00c9 \u00f3bvio que, se o banco do Petya estiver preenchido apenas com dados de teste, ele pode n\u00e3o cobrir todos os casos problem\u00e1ticos. Por exemplo, ao excluir uma tabela, descobre-se que h\u00e1 registros em outras tabelas com Foreign Key, relacionados aos registros na tabela exclu\u00edda. Ou ao alterar o tipo de coluna, descobre-se que nem 100% dos dados podem ser convertidos para o novo tipo. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-1\">Como resolver<\/h4>\n<p><\/p>\n<ul>\n<li>Escrever scripts especiais que ser\u00e3o aplicados uma \u00fanica vez junto com a migra\u00e7\u00e3o e formatar os dados adequadamente. Esta \u00e9 uma solu\u00e7\u00e3o geral para o problema de transfer\u00eancia de dados para novas estruturas ap\u00f3s a aplica\u00e7\u00e3o das migra\u00e7\u00f5es, mas algo semelhante pode ser aplicado tamb\u00e9m antes, em casos espec\u00edficos. Este caminho, \u00e9 claro, nem sempre est\u00e1 dispon\u00edvel, pois editar dados em servidores ao vivo pode ser perigoso e at\u00e9 catastr\u00f3fico. <\/li>\n<li>Outro caminho complexo \u00e9 editar o changset existente. A dificuldade reside no fato de que todos os bancos de dados onde ele j\u00e1 foi aplicado na forma atual ter\u00e3o que ser restaurados. \u00c9 bem poss\u00edvel que toda a equipe de backend tenha que implementar localmente o banco de dados a partir do zero. <\/li>\n<li>E o caminho mais universal \u00e9 transferir o problema de dados para o ambiente do desenvolvedor, recriando a mesma situa\u00e7\u00e3o e adicionando um novo changset, antes do que foi quebrado, que permitir\u00e1 contornar o problema.<br \/>\n<img decoding=\"async\" alt=\"Como n\u00e3o cometer erros ao usar o Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/b5d28a940a7a35b6cd7a819a8e68f027.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>De modo geral, quanto mais a base de dados se assemelhar \u00e0 base do servidor de produ\u00e7\u00e3o, menores ser\u00e3o as chances de que os problemas com as migra\u00e7\u00f5es se estendam. E, claro, antes de enviar o changset para o reposit\u00f3rio, vale a pena pensar v\u00e1rias vezes se n\u00e3o quebrar\u00e1 algo. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-3-liquibase-nachinaet-primenyatsya-uzhe-posle-vyhoda-v-prodakshn\">Situa\u00e7\u00e3o 3. O Liquibase come\u00e7a a ser aplicado j\u00e1 ap\u00f3s o lan\u00e7amento em produ\u00e7\u00e3o.<\/h3>\n<p><\/p>\n<p>Suponha que o l\u00edder de equipe pediu ao Petya para integrar o Liquibase no projeto, no entanto, o projeto j\u00e1 est\u00e1 em produ\u00e7\u00e3o e existe uma estrutura de banco j\u00e1 estabelecida.<\/p>\n<p><\/p>\n<p>Portanto, o problema \u00e9 garantir que em quaisquer novos servidores ou m\u00e1quinas de desenvolvedores, os dados dessas tabelas devem ser recriados do zero, enquanto o ambiente existente deve permanecer em um estado consistente, pronto para receber novos changsets. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-2\">Como resolver<\/h4>\n<p><\/p>\n<p>Aqui tamb\u00e9m existem algumas op\u00e7\u00f5es:<\/p>\n<p><\/p>\n<ul>\n<li>A primeira e mais \u00f3bvia \u00e9 ter um script separado que deve ser aplicado manualmente durante a inicializa\u00e7\u00e3o de um novo ambiente. <\/li>\n<li>A segunda \u2014 menos \u00f3bvia, \u00e9 ter uma migra\u00e7\u00e3o do Liquibase que reside em outro Contexto do Liquibase e aplic\u00e1-la. Mais sobre o Contexto do Liquibase pode ser lido aqui: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/contexts.html\">https:\/\/www.liquibase.org\/documentation\/contexts.html<\/a><\/noindex>. No geral, \u00e9 um mecanismo interessante que pode ser usado com sucesso, por exemplo, para testes. <\/li>\n<li>O terceiro caminho consiste em v\u00e1rios passos. Primeiro, deve-se criar uma migra\u00e7\u00e3o para as tabelas que j\u00e1 existem. Em seguida, ela deve ser aplicada em algum ambiente, e assim ser\u00e1 obtido seu hash. O pr\u00f3ximo passo \u00e9 inicializar nossas tabelas Liquibase vazias no servidor que n\u00e3o est\u00e1 vazio, e na tabela de hist\u00f3rico de aplica\u00e7\u00e3o dos changelogs, pode-se manualmente adicionar um registro de um changelog \"aplicado\" com as altera\u00e7\u00f5es j\u00e1 existentes na base. Assim, no servidor j\u00e1 existente, a contagem do hist\u00f3rico come\u00e7ar\u00e1 a partir da vers\u00e3o 2, e todos os novos ambientes se comportar\u00e3o de maneira id\u00eantica.<br \/>\n<img decoding=\"async\" alt=\"Como n\u00e3o cometer erros ao usar o 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\u00e7\u00e3o 4. As migra\u00e7\u00f5es se tornam enormes e n\u00e3o conseguem ser executadas a tempo.<\/h3>\n<p><\/p>\n<p>No in\u00edcio do desenvolvimento do servi\u00e7o, geralmente, o Liquibase \u00e9 usado como uma depend\u00eancia externa, e todas as migra\u00e7\u00f5es s\u00e3o processadas ao iniciar o aplicativo. No entanto, com o tempo, voc\u00ea pode se deparar com os seguintes casos:<\/p>\n<p><\/p>\n<ul>\n<li>As migra\u00e7\u00f5es se tornam enormes e levam muito tempo para serem executadas.<\/li>\n<li>Surge a necessidade de migra\u00e7\u00f5es em ambientes distribu\u00eddos, digamos, em v\u00e1rias inst\u00e2ncias de servidores de banco de dados ao mesmo tempo.<br \/>\nNesse caso, a aplica\u00e7\u00e3o excessivamente longa das migra\u00e7\u00f5es resultar\u00e1 em um timeout ao iniciar o aplicativo. Al\u00e9m disso, aplicar migra\u00e7\u00f5es para cada inst\u00e2ncia do aplicativo separadamente pode levar a estados desincronizados entre diferentes servidores. <\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"kak-reshat-3\">Como resolver<\/h4>\n<p><\/p>\n<p>Nesses casos, seu projeto j\u00e1 \u00e9 grande, possivelmente at\u00e9 maduro, e o Liquibase come\u00e7a a atuar como uma ferramenta externa separada. A quest\u00e3o \u00e9 que o Liquibase, como biblioteca, \u00e9 empacotado em um arquivo jar e pode operar tanto como uma depend\u00eancia dentro do projeto como de forma aut\u00f4noma. <\/p>\n<p><\/p>\n<p>No modo aut\u00f4nomo, voc\u00ea pode deixar a aplica\u00e7\u00e3o das migra\u00e7\u00f5es sob a responsabilidade do seu ambiente CI\/CD ou nas m\u00e3os de bons especialistas em administra\u00e7\u00e3o de sistemas e implanta\u00e7\u00e3o. Para isso, ser\u00e1 necess\u00e1ria a linha de comando do Liquibase. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/command_line.html\">https:\/\/www.liquibase.org\/documentation\/command_line.html<\/a><\/noindex>. Nesse modo, h\u00e1 a possibilidade de iniciar o aplicativo somente ap\u00f3s todas as migra\u00e7\u00f5es necess\u00e1rias terem sido realizadas.<\/p>\n<p><\/p>\n<h2 id=\"vyvod\">Sa\u00edda<\/h2>\n<p><\/p>\n<p>Na verdade, as armadilhas ao trabalhar com migra\u00e7\u00f5es de BD podem ser muito mais numerosas, e muitas delas exigem uma abordagem criativa. \u00c9 importante entender que, se a ferramenta for utilizada corretamente, a maioria dessas armadilhas pode ser evitada. Especificamente, eu enfrentei todos os problemas listados em v\u00e1rias formas, e alguns deles foram resultado de meus erros. Normalmente isso acontece, claro, por falta de aten\u00e7\u00e3o, mas \u00e0s vezes \u2013 por causa da falta de habilidade em utilizar a ferramenta.<\/p>\n<p>Fonte: <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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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\udd47Como n\u00e3o se prejudicar ao usar o Liquibase | ProHoster","description":"Nunca houve, e aqui estamos novamente! Em um projeto recente, decidimos usar o Liquibase desde o in\u00edcio para evitar problemas no futuro.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/70973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=70973"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/70973\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/70974"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=70973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=70973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=70973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}