Introdução ao Liquibase Rollback

Introdução ao Liquibase Rollback

1. Visão geral

Em nossoprevious article, mostramos Liquibase como uma ferramenta para gerenciar dados e esquemas de banco de dados.

Neste artigo, vamos olhar mais para o recurso de reversão - e como podemos desfazer uma operação Liquibase.

Naturalmente, esse é um recurso crítico de qualquer sistema de nível de produção.

2. Categorias de migrações Liquibase

Existem duas categorias de operações Liquibase, resultando em uma geração diferente de uma declaração de reversão:

  • automatic, onde a migração pode gerar deterministicamente as etapas necessárias para o rollback

  • manual, onde precisamos emitir um comando de rollback porque a instrução de migração não pode ser usada para identificar a instrução de forma determinística

Por exemplo,the rollback of a “create table” statement would be to “drop” the created table. Isso pode ser determinado sem dúvida e, portanto, a instrução de reversão pode ser gerada automaticamente.

Por outro lado,the rollback statement for a “drop table” command is not possible to be determined. Não é possível determinar o último estado da tabela e, portanto, a instrução de rollback não pode ser gerada automaticamente. These types of migration statements require a manual rollback instructions.

3. Escrevendo uma instrução de reversão simples

Vamos escrever um changeset simples que criará uma tabela quando executado e adicionará uma instrução de rollback ao changeset:


    
        
        
        
    
    
        
    

O exemplo acima se enquadra na primeira categoria mencionada acima. Ele criará uma instrução de reversão automaticamente se não adicionarmos uma. Mas podemos substituir o comportamento padrão criando nossa declaração de reversão.

Podemos executar a migração usando o comando:

mvn liquibase:update

Após a execução, podemos reverter a ação usando:

mvn liquibase:rollback

Isso executa o segmento de reversão do conjunto de alterações e deve reverter a tarefa concluída durante o estágio de atualização. Mas se emitirmos esse comando sozinhos, a construção falhará.

A razão para isso é - não especificamos o limite de reversão; o banco de dados será completamente eliminado, revertendo para o estágio inicial. Portanto, é obrigatório definir uma das três restrições abaixo para limitar a operação de reversão quando a condição for satisfeita:

  • rollbackTag

  • rollbackCount

  • rollbackDate

3.1. Revertendo para uma tag

Podemos definir um estado específico do nosso banco de dados como uma tag. Portanto, podemos fazer referência a esse estado. Reverter para o nome da tag "1.0" se parece com:

mvn liquibase:rollback -Dliquibase.rollbackTag=1.0

Isso executa instruções de reversão de todos os conjuntos de alterações executados após a tag "1.0".

3.2. Revertendo por contagem

Aqui, definimos quantos conjuntos de alterações precisamos ser revertidos. Se definirmos como um, a última execução do conjunto de alterações será revertida:

mvn liquibase:rollback -Dliquibase.rollbackCount=1

3.3. Revertendo à Data

Como podemos definir um destino de reversão como uma data, portanto, qualquer conjunto de alterações executado após esse dia será revertido:

mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"

O formato de data deve ser um formato de dados ISO ou deve corresponder ao valor deDateFormat.getDateInstance() da plataforma de execução.

4. Opções de Rollback Changeset

Vamos explorar quais são os possíveis usos da instrução rollback em changesets.

4.1. Reversão de várias instruções

Uma única tag de reversão pode incluir mais de uma instrução a ser executada:


    
        
        
    
    
        
        
    
    
        
        
    

Aqui deixamos cair duas tabelas na mesma tag de reversão. Também podemos dividir a tarefa em várias instruções.

4.2. Várias tags de reversão

Em um changeset, podemos ter mais de uma tag de reversão. Eles são executados na ordem de aparência no changeset:


    
        
        
    
    
        
        
    
    
        
    
    
        
    

4.3. Consulte outro conjunto de alterações para reversão

Podemos nos referir a outro conjunto de alterações, possivelmente o conjunto de alterações original, se quisermos alterar alguns detalhes do banco de dados. Isso reduzirá a duplicação de código e poderá reverter corretamente as alterações feitas:


    
    
    

4.4. Tag de rollback vazia

Por padrão, o Liquibase tenta gerar um script de reversão, se não tivermos fornecido. Se precisarmos quebrar esse recurso, podemos ter uma tag de reversão vazia para que a operação de reversão não seja revertida:


    
        
        
        
    
    

5. Opções de comando de reversão

Além de reverter um banco de dados para um estado anterior, o Liquibase pode ser usado de várias maneiras diferentes. Ou seja, gerar o SQL de reversão, criar script de reversão futura e, finalmente, podemos testar a migração e a reversão, ambas em uma única etapa.

5.1. Gerar script de reversão

Assim como a reversão, temos três opções em mãos para gerar a reversão SQL. Esses são:

  • rollbackSQL<tag> - um script para reverter o banco de dados para a tag mencionada

  • rollbackToDateSQL<date/time> - um script SQL para reverter o banco de dados para o estado na data / hora mencionada

  • rollbackCountSQL<value> - um script SQL para reverter o banco de dados para o estado mencionado pelo número de etapas anteriores

Vejamos um dos exemplos em ação:

mvn liquibase:rollbackCountSQL 2

5.2. Gerar script de reversão futura

Este comando gera os comandos SQL de reversão necessários para trazer o banco de dados ao estado atual a partir do estado, no qual os conjuntos de alterações elegíveis para execução no momento foram concluídos. Isso será muito útil se houver a necessidade de fornecer um script de reversão para uma alteração que estamos prestes a executar:

Isso será muito útil se houver a necessidade de fornecer um script de reversão para uma alteração que estamos prestes a executar:

mvn liquibase:futureRollbackSQL

5.3. Executar atualização de teste de reversão

Este comando executa a atualização do banco de dados e, em seguida, reverte os conjuntos de alterações para trazer o banco de dados ao estado atual. A reversão futura e a reversão de teste de atualização não alteram o banco de dados atual após a conclusão da execução. Mas a reversão de teste de atualização executa a migração real e depois a reverte.

Isso pode ser usado para testar a execução de alterações de atualização sem alterar permanentemente o banco de dados:

mvn liquibase:updateTestingRollback

6. Conclusão

Neste tutorial rápido, exploramos alguns recursos de linha de comando e conjunto de alterações da funcionalidade de reversão do Liquibase.

Como sempre, o código-fonte pode ser encontradoover on GitHub.