Flyway 3.0-migratiecontrolesom komt niet overeen

na het upgraden van de Flyway Maven-plug-in van 2.3 naar 3.0 krijg ik:

[ERROR] Doel niet uitvoeren
org.flywaydb:flyway-maven-plugin:3.0:migreren (standaard-cli) op ​​project
xxx: org.flywaydb.core.api.FlywayException: valideren mislukt. Gevonden
verschillen tussen toegepaste migraties en beschikbare migraties:
Migratiecontrolesom komt niet overeen voor migratie
V003__data_feed_sources_locations.sql: DB=942424992,
Classpath=1117634405 -> [Help 1]

Kreeg een soortgelijke fout bij een ander project.

Als ik terug naar 2.3 downgrade, verloopt de migratie goed. Heeft dit iets te maken met verschillende platformcoderingen voor het berekenen van checksums?

Is er een tijdelijke oplossing, of beter nog, een goede oplossing?


Antwoord 1, autoriteit 100%

Flyway 3.0 heeft de standaard ValidOnMigrate gewijzigd in true.

Dit is echter een goede zaak, want in de geest van snel falen worden fouten eerder ontdekt.

In jouw geval zijn sommige scripts veranderd sinds ze zijn toegepast, wat Flyway meldt.

Je hebt twee opties:

  • onderdruk de fout door validOnMigrate in te stellen op false (2.3 standaardgedrag)
  • roep Flyway.repair()aan om de controlesommen opnieuw uit te lijnen

Referentie
Flyway-reparatie


Antwoord 2, autoriteit 21%

Toevoegen aan het antwoord van Axel Fontaine:

Ik kon mvn flyway:repair gebruiken, maar ik moest de configuratie-eigenschap flyway.locationsnaar de map verwijzen die mijn db-migratiescripts bevat. Anders krijg ik de melding “Reparatie van metadatatabel xyz.schema_version niet nodig. Geen mislukte migratie gedetecteerd.” zoals andere mensen al zeiden.

Ik gebruikte mvn -Dflyway.locations=filesystem:<project dir>/src/main/resources/db/migrations flyway:repairen ik zag de checksum bijgewerkt in de metadatatabel, waardoor mijn probleem.


Antwoord 3, autoriteit 8%

Eerst zoekt het naar wijzigingen in de controlesom. Deze wijzigingen treden op als we migratiebestanden bijwerken die al zijn toegepast op een db-instantie.

FlywayException: valideren mislukt: migratiecontrolesom komt niet overeen voor migratieversie 18.2.6

-> Toegepast op database: 90181454

-> Lokaal opgelost: 717386176

De methode

repair()lost het probleem met de controlesom op door de tabel flyway_schema_historybij te werken met de lokale controlesomwaarde.

Het zou echter bijgewerkte instructies in hetzelfde migratiebestand negeren. Nieuwe wijzigingen in hetzelfde bestand worden dus genegeerd omdat er al een vermelding voor de versie in de tabel flyway_schema_historystaat. setValidateOnMigrate() methode heeft geen effect in dit scenario. We moeten een incrementele benadering volgen, schemawijzigingen moeten worden geleverd via nieuwe bestanden.


Antwoord 4, autoriteit 7%

Ik vond de gemakkelijkste manier om dit probleem op te lossen, was om de checksum in de schematabel letterlijk bij te werken naar de verwachte waarde. Ik wist zeker dat mijn migratiebestanden niet waren veranderd en dat de huidige staat van de database was wat het moest zijn. Ik wilde ook geen tijd besteden aan het lezen van documentatie en het rommelen met Flyway.repair()of andere methoden die de zaken mogelijknog meer zouden kunnen verknoeien. Een simpele sql-update loste het meteen op


Antwoord 5, autoriteit 2%

Het probleem treedt op direct nadat ik het V1_2__books.sql ddl-bestand heb gewijzigd. Er zou een betere manier moeten zijn om flyway te forceren om de nieuwe wijzigingen te herkennen!!!

Ik heb geprobeerd mvn flyway:repair uit te voeren maar het werkte niet, ik heb uiteindelijk de schema-url in het bestand application.properties [datasource.flyway.url] gewijzigd in books2

Ik heb ook de onderstaande bestanden verwijderd (boeken is mijn oude schemanaam)

~ @~:rm books.mv.db 
~ @~:rm -r books.trace.db 
datasource.flyway.url=jdbc:h2:file:~/books2
datasource.flyway.username=sa
datasource.flyway.password=
datasource.flyway.driver-class-name=org.h2.Driver

Ik heb de applicatie en BINGO uitgevoerd 🙂


Antwoord 6

De controlesom moet worden bijgewerkt met behulp van de opdracht flyway repair (voer de opdracht Flyway uit zoals vermeld in “Upgrade-procedure”, maar vervang “migrate” door “repair”).

Ik raad u aan niet rechtstreeks in te breken in databases, sql-scripts, enz. Het kan gevaarlijk zijn

Voorbeeld:
./flyway repare-user=root -password=changeme -url=jdbc:mysql://localhost/mypath -table=my_flyway_schema_version_table -locations=filesystem:/mypath_sql_scripts


Antwoord 7

als u op lokale db draait, kunt u de tabel flyway_schema_history verwijderen


Antwoord 8

Ik wilde alleen toevoegen dat de controlesom door reparatie kan worden bijgewerkt. Flyway moet toegang hebben tot de directory waar alle migraties zich bevinden. Anders gaat flyway gewoon door met zijn zaken en output

“Reparatie van mislukte migratie in metadatatabel xyz.schema_versionniet nodig. Geen mislukte migratie gedetecteerd.”


Antwoord 9

Roep Flyway.repair()rechtstreeks op vanuit configuraties.

Voeg onderstaande bean toe aan uw configuratieklasse of maak een nieuwe klasse met @Congigurationannotatie en voeg de onderstaande code toe.

   @Bean
    public FlywayMigrationStrategy repairFlyway() {
        return flyway -> {
            // repair each script's checksum
            flyway.repair();
            // before new migrations are executed
            flyway.migrate();
        };
    }

Antwoord 10

Er is nog een andere oplossing. U kunt uw migratie uit de tabel schema_versionverwijderen.

Other episodes