Migraties ongedaan maken met Flyway

1. Inleiding

In deze korte tutorial onderzoeken we een aantal manieren om een ​​migratie met Flyway terug te draaien.

2. Simuleer Rollback met een migratie

In deze sectie zullen we onze database terugdraaien met behulp van een standaard migratiebestand.

In onze voorbeelden gebruiken we de opdrachtregelversie van Flyway. De kernprincipes zijn echter evenzeer van toepassing op de andere formaten, zoals de kern-API, Maven-plug-in, enz.

2.1. Creëer migratie

Laten we eerst een nieuw boek table toe aan onze database. Om dit te doen, maken we een migratiebestand met de naam V1_0__create_book_table.sql:

maak een tabelboek (id numeriek, titel varchar (128), auteur varchar (256), beperking pk_book primaire sleutel (id));

Ten tweede, laten we de migratie toepassen:

./flyway migreren

2.2. Simuleer Rollback

Stel dan dat we op een gegeven moment de laatste migratie moeten terugdraaien.

Om de database te herstellen naar vóór het boek tabel is gemaakt, laten we migratie maken met de naam V2_0__drop_table_book.sql:

laat tafelboek vallen;

Laten we vervolgens de migratie toepassen:

./flyway migreren

Ten slotte kunnen we de geschiedenis van alle migraties controleren met behulp van:

./flyway info

wat ons de volgende output geeft:

+ ----------- + --------- + ------------------- + ------ + --------------------- + --------- + | Categorie | Versie | Beschrijving | Type | Geïnstalleerd op | Staat | + ----------- + --------- + ------------------- + ------ + --------------------- + --------- + | Versiebeheer | 1.0 | maak een boekentafel | SQL | 2020-08-29 16:07:43 | Succes | | Versiebeheer | 2.0 | drop tafel boek | SQL | 2020-08-29 16:08:15 | Succes | + ----------- + --------- + ------------------- + ------ + --------------------- + --------- +

Merk op dat onze tweede migratie succesvol is verlopen.

Wat Flyway betreft, is het tweede migratiebestand gewoon een andere standaardmigratie. Het daadwerkelijke herstellen van de database naar de vorige versie gebeurt volledig via SQL. In ons geval is de SQL voor het laten vallen van de tabel bijvoorbeeld het tegenovergestelde van de eerste migratie, die de tabel maakt.

Met behulp van deze methode de audit trail laat ons niet zien dat de tweede migratie gerelateerd is aan de eerste, aangezien ze verschillende versienummers hebben. Om zo'n audit trail te krijgen, moeten we Flyway Undo gebruiken.

3. Flyway Undo gebruiken

Ten eerste is het belangrijk om dat op te merken Flyway Undo is een commerciële functie van Flyway en is niet beschikbaar in de Community-editie. Daarom hebben we de Pro Edition of Enterprise Edition nodig om deze functie te gebruiken.

3.1. Maak migratiebestanden

Laten we eerst een migratiebestand maken met de naam V1_0__create_book_table.sql:

maak een tabelboek (id numeriek, titel varchar (128), auteur varchar (256), beperking pk_book primaire sleutel (id));

Ten tweede maken we het bijbehorende migratiebestand voor ongedaan maken U1_0__create_book_table.sql:

laat tafelboek vallen;

Let bij onze migratie ongedaan maken op hoe het bestandsnaamvoorvoegsel 'U' is in vergelijking met het normale migratievoorvoegsel 'V'. Ook in onze migratiebestanden ongedaan maken, we schrijven de SQL die de wijzigingen van het overeenkomstige migratiebestand ongedaan maakt. In ons geval laten we de tabel vallen die is gemaakt door de normale migratie.

3.2. Pas migraties toe

Laten we vervolgens de huidige status van de migraties bekijken:

./flyway -pro info

Dit geeft ons de volgende output:

+ ----------- + --------- + ------------------- + ------ + -------------- + --------- + ---------- + | Categorie | Versie | Beschrijving | Type | Geïnstalleerd op | Staat | Ongedaan maken | + ----------- + --------- + ------------------- + ------ + -------------- + --------- + ---------- + | Versiebeheer | 1.0 | maak een boekentafel | SQL | | In afwachting | Ja | + ----------- + --------- + ------------------- + ------ + -------------- + --------- + ---------- + 

Let op de laatste kolom, Ongedaan te maken, wat aangeeft dat Flyway een migratiebestand voor ongedaan maken heeft gedetecteerd dat bij ons normale migratiebestand hoort.

Laten we vervolgens onze migraties toepassen:

./flyway migreren

Als het voltooid is, zijn onze migraties voltooid en heeft ons schema een nieuwe boekentabel:

 Lijst met relaties Schema | Naam | Type | Eigenaar -------- + ----------------------- + ------- + -------- - openbaar | boek | tafel | baeldung openbaar | flyway_schema_history | tafel | baeldung (2 rijen) 

3.3. De laatste migratie terugdraaien

Laten we tot slot de laatste migratie ongedaan maken met behulp van de opdrachtregel:

./flyway -pro ongedaan maken

Nadat de opdracht met succes is uitgevoerd, kunnen we de status van de migraties opnieuw controleren:

./flyway -pro info

wat ons de volgende output geeft:

+ ----------- + --------- + ------------------- + ------- --- + --------------------- + --------- + ---------- + | Categorie | Versie | Beschrijving | Type | Geïnstalleerd op | Staat | Ongedaan maken | + ----------- + --------- + ------------------- + ------- --- + --------------------- + --------- + ---------- + | Versiebeheer | 1.0 | maak een boekentafel | SQL | 2020-08-22 15:48:00 | Ongedaan gemaakt | | | Ongedaan maken | 1.0 | maak een boekentafel | UNDO_SQL | 2020-08-22 15:49:47 | Succes | | | Versiebeheer | 1.0 | maak een boekentafel | SQL | | In afwachting | Ja | + ----------- + --------- + ------------------- + ------- --- + --------------------- + --------- + ---------- +

Merk op hoe het ongedaan maken is gelukt en de eerste migratie is weer in behandeling. Ook, in tegenstelling tot de eerste methode, de audit trail toont duidelijk de migraties die werden teruggedraaid.

Hoewel Flyway Undo nuttig kan zijn, gaat het ervan uit dat de hele migratie geslaagd is. Het werkt bijvoorbeeld mogelijk niet zoals verwacht als een migratie halverwege mislukt.

4. Conclusie

In deze korte tutorial hebben we gekeken naar het herstellen van onze database met een standaardmigratie. We hebben ook gekeken naar de officiële manier om migraties terug te draaien met Flyway Undo. Zoals gewoonlijk is al onze code die betrekking heeft op deze tutorial te vinden op GitHub.