image

Access unlimited bootcamps and 650+ courses

50
%OFF
Felipe Silva
Felipe Silva28/02/2025 18:43
Share

🛠️ Erro de Migração no Flyway e Como Resolver

    Recentemente, enquanto trabalhava em um projeto, me deparei com um erro chato ao rodar uma migração com o Flyway. Se você já passou (ou ainda vai passar) por isso, fique tranquilo! Vou compartilhar o que aconteceu comigo e como resolvi para ajudar quem esbarrar nesse problema no futuro. 🚀

    🤔 O que aconteceu?

    Eu tentei rodar uma migração no banco de dados MySQL para criar uma tabela chamada employees_audit. Mas, ao executar o Flyway, me deparei com a seguinte mensagem de erro:

    Exception in thread "main" org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validation
    Detected failed migration to version 202502281708 (create employees audit table).
    Please remove any half-completed changes then run repair to fix the schema history.
    

    E não importa o quanto eu tentava alterar os arquivos, tanto no "db.migration" como no próprio projeto java. Na hora, fiquei meio perdido, mas depois de analisar a situação, percebi que o problema estava no histórico de migração do Flyway.

    🔍 O que causa esse erro?

    O Flyway mantém um histórico de migrações aplicadas no banco de dados através da tabela flyway_schema_history. Quando uma migração falha, o Flyway marca essa versão como "FAILED" e impede novas execuções até que o problema seja resolvido. Isso evita inconsistências no banco.

    No meu caso, o erro aconteceu ao tentar rodar esta SQL:

    CREATE TABLE employees_audit (
      id BIGINT NOT NULL AUTO_INCREMENT,
      name VARCHAR(150),
      old_name VARCHAR(150),
      salary DECIMAL(10,2),
      old_salary DECIMAL(10,2),
      birthday TIMESTAMP,
      old_birthday TIMESTAMP,
      operation CHAR(1),
      created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    O problema pode ter sido causado por:

    • A tabela já existir parcialmente no banco devido a uma migração anterior falha.
    • Alguma restrição no MySQL, como TIMESTAMP sem DEFAULT.
    • A versão da migração já estar marcada como "FAILED" no Flyway.

    Se você também está passando por isso, aqui está como corrigir! 🎯

    🔧 Como Resolver o Erro

    1️⃣ Use o repair(); do Flyway (Solução mais rápida ✅)

    O Flyway tem um método chamado repair(), que limpa migrações com falhas no histórico e permite rodá-las novamente. Isso resolveu o meu problema instantaneamente!

    Volte até sua pasta Main e adicione este código:

    flyway.repair();  // Após adicionar essa linha de código ele vai fazer um reparo automatico no seu Flyway e vai realizar a migração da tabela logo após
    flyway.migrate();
    

    2️⃣ Verifique se a tabela já existe

    Se a tabela employees_audit foi parcialmente criada antes do erro, o Flyway pode estar tentando recriá-la. Para checar, abra seu DBeaver no seu banco de dados:

    image

    Primeiro de dois cliques nas tabelas:

    image

    Se for de tabela parcialmente criada ela vai aparecer aqui, por via das duvidas atualize a pagina como na imagem abaixo:

    image

    3️⃣ Verifique a tabela flyway_schema_history

    O Flyway registra todas as migrações nessa tabela. Você pode checar seu status com:

    SELECT * FROM flyway_schema_history;
    

    Se a versão yyyymmddhhmm estiver com status "FAILED", significa que a migração falhou e o Flyway não permitirá novas execuções até que seja corrigida. Para resolver, remova manualmente o registro da migração com falha:

    DELETE FROM flyway_schema_history WHERE version = 'yyyymmddhhmm';
    

    Depois, tente rodar migrate() novamente. 🔄

    4️⃣ Corrija possíveis problemas na SQL

    Se o erro persistir, pode haver um problema na sintaxe SQL. Aqui está uma versão melhorada da tabela:

    CREATE TABLE employees_audit (
      id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(150),
      old_name VARCHAR(150),
      salary DECIMAL(10,2),
      old_salary DECIMAL(10,2),
      birthday DATETIME,
      old_birthday DATETIME,
      operation CHAR(1) NOT NULL,
      created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    Dicas de melhoria:

    ✅ Use DATETIME em vez de TIMESTAMP, que pode ter restrições.

    ✅ Defina NOT NULL para operation, garantindo que sempre tenha valor.

    🎉 Conclusão

    Se sua migração do Flyway falhou, siga esses passos:

    ✅ Rode repair() antes de migrate().

    ✅ Verifique se a tabela já existe.

    ✅ Consulte flyway_schema_history para limpar registros falhos.

    ✅ Ajuste a SQL, se necessário.

    Esse erro me pegou de surpresa, mas agora sei como lidar com ele. Espero que este guia ajude quem também estiver quebrando a cabeça com isso! Se precisar de ajuda, comenta aí

    Se esse erro fui de alguma forma útil para você da uma curtida, comenta aí. Conforme eu for enfrentando mais erros nessa jornada do Bootcamp você vai encontrar minhas soluções por aqui mesmo!

    Share
    Recommended for you
    Decola Tech 2025
    Microsoft AI for Tech - Copilot Studio
    Suzano - Python Developer
    Comments (0)