Änderungen in Datenbanken verwalten – LiquiBase

Ich habe mir gerade Liquibase als DB-Change-Management Tool angeschaut und will euch meine Notizen natürlich nicht vorenthalten. Tonspur gibt es leider (noch) keine dazu. Die Videos auf der Seite sind sehr gut, aber vorsicht, es sind einigen neue Features seit dem hinzugekommen.

Features

  • http://www.liquibase.org
  • Database Changemanagement Tool => Keine Installation notwendig
  • Ähnlichkeit zu Ant
  • Ist in Java geschrieben.
  • Open Source. Steht unter der Apache License.
  • Unterstützt 12 DBMS: MySQL, PostgreSQL, DB2, Oracle, … => Changes sind unabhängig vom DBMS
  • Xml als Grundlage zur Beschreibung der Changes
    • Sollten auch VCS sein, dann ist Branching & Merging möglich.
    • <include> um andere XML-Dateien zu inkludieren => Best practice wegen Wartbarkeit: 1.0.xml, 1.1.xml, … in main.xml inkludieren
    • <includeAll> für ganzes verzeichnis
    • <precondition> um Vorbedingungen / Erwartungen zu prüfen => z.B. via <dbms> Tag auf ein bestimmtes DBMS prüfen
    • <changeSet> beschreibt einen Change
      • id Attribut sollte beschreibend sein (Alphanumerisch)
      • alwaysRun Attribut sorgt dafür, dass ein ChangeSet bei jeder Migration ausgeführt wird, z.B. Optimize Table
      • runOnChange Attribut sorgt dafür dass ein Change bei jeder Änderung am XML ausgeführt wird, z.B. Views oder Stored Procedur erstellen
      • context Attribut führt nur Changesets aus, die dem aktuellen Context entsprechen (Lässt sich beim Aufruf übergeben). Mehrere sind möglich. => Z.B. Daten auf Testsystem einspielen.
      • ChangeSets laufen in einer Transaktion ab, wenn unterstütz.
    • 34 Refactorings werden unterstützt
      • Einfache: createTable, dropTable, addColumn, renameColumn, …
      • Komplexere: mergeColumns (zwei Spalten werden mit einem Trennzeichen verbunden und in einen neue Spalte kopiert), addLookupTable (Werte werden aus einer Saplte in eine neue Tabelle kopiert und durch ForeignKeys ersetzt)
    • Native SQL kann genutzt werden => <sql>, <sqlFile>
    • Plugins bzw. CustomJava Classes können genutzt werden
    • <comment> enthält Kommentare / Dokumentation
  • Jeder Change ist unabhängig
    • Version + Author + XML-Filepath erzeugen UniqueId
  • Abgleich der XML-Datei mit databasechangelog-Tabelle, welche automatisch erzeugt wird, wenn ein Change nicht in DB ist, wird dieser ausgeführt und in DB geschrieben
  • XML-Datei ist durch MD5 gegen Veränderung geschützt
  • Mehrer Schemata möglich => Vordefinierte Tabellen werden standradmäßig in defaultSchema geschrieben
  • Rollback ist automatisch möglich, zusätzlich noch durch Tag
    • Rollback zu Version, zu Datum, … möglich
  • databasechangeloglock Tabelle kontrolliert Locking => kein gleichzeitiges Ausführen
  • Development Prozeß muss angepasst werden => Ausführen von LiquiBase
  • Kann anstatt des dirketen ausführens der Statements auch „nur“ SQl erzeugen, z.B. zum Review
  • kann JavaDoc-Style DB Dokumentation erzeugen
  • Reverse Engineering für bestehendes Schema möglich => Allerdings ohne Trigger, Stored Procedures, …
  • Durch Namspace and Schema Code-Vervollständigung, … in IDE, für Eclipse Plugin verfügbar
  • Hibernate Integation möglich => hbm2ddl Replacement
  • Kann via CLI, Ant, Maven, Spring, … ausgeführt werden
  • Tagging eines Standes der DB möglich und nachher theorethisch Rollback zu diesem Tag

Beispiel Change File


<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
<changeSet id="1" author="bob">
<createTable tableName="department">
<column name="id" type="int">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="name" type="varchar(50)">
<constraints nullable="false"/>
</column>
<column name="active" type="boolean" defaultValueBoolean="true"/>
</createTable>
</changeSet>
</databaseChangeLog>

Ausführen der CLI


liquibase --driver=com.mysql.jdbc.Driver \
--classpath=/path/to/classes \
--changeLogFile=com/example/db.changelog.xml \
--url="jdbc:mysql://localhost/example" \
--username=user \
--password=asdf \
migrate

GD Star Rating
loading...

Kommentar verfassen