Einführung in Liquibase Rollback

Einführung in Liquibase Rollback

1. Überblick

In unserenprevious article haben wir Liquibase als Tool zum Verwalten von Datenbankschemata und -daten gezeigt.

In diesem Artikel werden wir uns eingehender mit der Rollback-Funktion befassen - und wie wir einen Liquibase-Vorgang rückgängig machen können.

Dies ist natürlich ein wichtiges Merkmal jedes Systems für die Produktion.

2. Kategorien von Liquibase-Migrationen

Es gibt zwei Kategorien von Liquibase-Operationen, die zu einer unterschiedlichen Generierung einer Rollback-Anweisung führen:

  • automatic, wobei die Migration deterministisch Schritte erzeugen kann, die für das Zurücksetzen erforderlich sind

  • manual, wo wir einen Rollback-Befehl ausgeben müssen, da die Migrationsanweisung nicht verwendet werden kann, um die Anweisung deterministisch zu identifizieren

Zum Beispielthe rollback of a “create table” statement would be to “drop” the created table. Dies kann ohne Zweifel bestimmt werden, und daher kann die Rollback-Anweisung automatisch generiert werden.

Andererseits istthe rollback statement for a “drop table” command is not possible to be determined. Es ist nicht möglich, den letzten Status der Tabelle zu ermitteln. Daher kann die Rollback-Anweisung nicht automatisch generiert werden. These types of migration statements require a manual rollback instructions.

3. Schreiben einer einfachen Rollback-Anweisung

Schreiben wir einen einfachen Änderungssatz, der bei der Ausführung eine Tabelle erstellt und dem Änderungssatz eine Rollback-Anweisung hinzufügt:


    
        
        
        
    
    
        
    

Das obige Beispiel fällt unter die erste oben erwähnte Kategorie. Es wird automatisch eine Rollback-Anweisung erstellt, wenn wir keine hinzufügen. Sie können das Standardverhalten jedoch überschreiben, indem Sie eine Rollback-Anweisung erstellen.

Wir können die Migration mit dem folgenden Befehl ausführen:

mvn liquibase:update

Nach der Ausführung können wir die Aktion zurücksetzen mit:

mvn liquibase:rollback

Dadurch wird das Rollback-Segment des Änderungssatzes ausgeführt und die in der Aktualisierungsphase abgeschlossene Aufgabe sollte zurückgesetzt werden. Wenn wir diesen Befehl jedoch alleine absetzen, schlägt der Build fehl.

Der Grund dafür ist - wir geben das Limit des Rollbacks nicht an; Die Datenbank wird vollständig gelöscht, indem ein Rollback zum Anfangsstadium durchgeführt wird. Daher muss eine der drei folgenden Einschränkungen definiert werden, um den Rollback-Vorgang zu begrenzen, wenn die Bedingung erfüllt ist:

  • rollbackTag

  • rollbackCount

  • rollbackDate

3.1. Zurückrollen zu einem Tag

Wir können einen bestimmten Status unserer Datenbank als Tag definieren. Daher können wir auf diesen Zustand zurückgreifen. Das Zurücksetzen auf den Tag-Namen "1.0" sieht folgendermaßen aus:

mvn liquibase:rollback -Dliquibase.rollbackTag=1.0

Dadurch werden Rollback-Anweisungen für alle Changesets ausgeführt, die nach dem Tag "1.0" ausgeführt wurden.

3.2. Rollback nach Anzahl

Hier definieren wir, wie viele Änderungssätze zurückgesetzt werden müssen. Wenn wir es als eins definieren, wird die letzte Ausführung des Änderungssatzes rückgängig gemacht:

mvn liquibase:rollback -Dliquibase.rollbackCount=1

3.3. Zurück zum Datum

Wir können ein Rollback-Ziel als Datum festlegen. Daher werden alle Änderungen, die nach diesem Tag ausgeführt werden, rückgängig gemacht:

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

Das Datumsformat muss ein ISO-Datenformat sein oder sollte mit dem Wert vonDateFormat.getDateInstance() der ausführenden Plattform übereinstimmen.

4. Rollback-Änderungssatzoptionen

Lassen Sie uns untersuchen, wie Rollback-Anweisungen in Änderungssätzen verwendet werden können.

4.1. Multistatement-Rollback

Ein einzelnes Rollback-Tag kann mehr als einen auszuführenden Befehl enthalten:


    
        
        
    
    
        
        
    
    
        
        
    

Hier legen wir zwei Tabellen im gleichen Rollback-Tag ab. Wir können die Aufgabe auch auf mehrere Anweisungen aufteilen.

4.2. Mehrere Rollback-Tags

In einem Changeset können mehrere Rollback-Tags vorhanden sein. Sie werden in der Reihenfolge ihres Auftretens im Änderungssatz ausgeführt:


    
        
        
    
    
        
        
    
    
        
    
    
        
    

4.3. Weitere Informationen zum Rollback finden Sie in einem anderen Änderungssatz

Wir können auf einen anderen Änderungssatz verweisen, möglicherweise auf den ursprünglichen Änderungssatz, wenn wir einige Details der Datenbank ändern wollen. Dies reduziert die Code-Duplizierung und kann die vorgenommenen Änderungen korrekt rückgängig machen:


    
    
    

4.4. Leeres Rollback-Tag

Standardmäßig versucht Liquibase, ein Rollback-Skript zu generieren, wenn wir dies nicht angegeben haben. Wenn wir diese Funktion unterbrechen müssen, können wir ein leeres Rollback-Tag haben, damit der Rollback-Vorgang nicht zurückgesetzt wird:


    
        
        
        
    
    

5. Rollback-Befehlsoptionen

Abgesehen davon, dass eine Datenbank auf einen früheren Status zurückgesetzt wird, kann Liquibase auf viele verschiedene Arten verwendet werden. Dies sind: Generieren Sie das Rollback-SQL, erstellen Sie ein zukünftiges Rollback-Skript, und schließlich können Sie die Migration und das Rollback in einem Schritt testen.

5.1. Rollback-Skript generieren

Wie beim Rollback stehen uns drei Optionen zum Generieren von Rollback-SQL zur Verfügung. Diese sind:

  • rollbackSQL<tag> - Ein Skript zum Zurücksetzen der Datenbank auf das angegebene Tag

  • rollbackToDateSQL<date/time> - Ein SQL-Skript zum Zurücksetzen der Datenbank auf den Status zum angegebenen Datum / Uhrzeit

  • rollbackCountSQL<value> - Ein SQL-Skript zum Zurücksetzen der Datenbank auf den Status, der durch die Anzahl der vorherigen Schritte angegeben wurde

Sehen wir uns eines der Beispiele in Aktion an:

mvn liquibase:rollbackCountSQL 2

5.2. Generieren Sie ein zukünftiges Rollback-Skript

Dieser Befehl generiert die erforderlichen Rollback-SQL-Befehle, um die Datenbank in den aktuellen Status zu versetzen, ausgehend von dem Status, in dem Änderungssätze abgeschlossen wurden, die zur Ausführung berechtigt sind. Dies ist sehr nützlich, wenn ein Rollback-Skript für eine bevorstehende Änderung bereitgestellt werden muss:

Dies ist sehr nützlich, wenn ein Rollback-Skript für eine bevorstehende Änderung bereitgestellt werden muss:

mvn liquibase:futureRollbackSQL

5.3. Führen Sie das Update Testing Rollback aus

Dieser Befehl führt die Datenbankaktualisierung aus und setzt dann die Änderungssätze zurück, um die Datenbank in den aktuellen Status zu versetzen. Sowohl das zukünftige Rollback als auch das Rollback der Aktualisierungstests ändern die aktuelle Datenbank nach Abschluss der Ausführung nicht. Das Rollback der Aktualisierungstests führt jedoch die eigentliche Migration durch und führt dann ein Rollback durch.

Dies kann verwendet werden, um die Ausführung von Aktualisierungsänderungen zu testen, ohne die Datenbank dauerhaft zu ändern:

mvn liquibase:updateTestingRollback

6. Fazit

In diesem kurzen Lernprogramm haben wir einige Befehlszeilen- und Änderungssatzfunktionen der Liquibase-Rollback-Funktionalität untersucht.

Wie immer kann der Quellcodeover on GitHub gefunden werden.