java student user group – meeting 61jsug.at/w/images/4/41/datenbank-evolution.pdf · database...

31
Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery 27. Januar 2014 Java Student User Group – Meeting 61 Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery Wolfgang Gruber 27. Januar 2014 INSO - Industrial Software Institut für Rechnergestützte Automation | Fakultät für Informatik | Technische Universität Wien

Upload: others

Post on 29-May-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Evolutionäre Datenbankentwicklungim Rahmen vonContinuous Delivery

27. Januar 2014

Java Student User Group – Meeting 61

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

Wolfgang Gruber

27. Januar 2014

INSO - Industrial SoftwareInstitut für Rechnergestützte Automation | Fakultät für Informatik | Technische Universität Wien

Page 2: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Inhalt

Database Engineering2

Datenmodellierung3

Database-Refactorings & -Transformations4

Continuous Delivery1

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery 2

Database-Migrations6

Database-Versioning5

Page 3: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Continuous Delivery

• Kontinuierliche Auslieferung von Software durch automatisierte Prozesse

• Beispiel: Tägliche Releases ohne Service-Unterbrech ung bei Facebook

• Prinzipien• Zuverlässiger & wiederholbarer Release-Prozess

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery 3

• Zuverlässiger & wiederholbarer Release-Prozess• Alles ist versioniert• „If it hurts, do it more frequently and bring the pain forward“• „Done means released“

• Vorteile• Höhere Zuverlässigkeit aufgrund weniger Fehler• Weniger Stress• Deutlich kürzere Cycle-Time• Fehler haben weniger Auswirkungen

Page 4: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Development Stages

• Software durchläuft von Entwicklung bis Prouktivbet riebmehrere Stufen

• Deployable Package wird von zentralem ContinuousIntegration Server erstellt

• Qualität nimmt mit jeder Stufe zu

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery 4

LokaleEntwicklung

Testsystem QSSystem

Produktion

Quality Gate Quality GatePackaging

Page 5: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Software-Engineering vs. Database-Engineering

• Relationale Datenbanken sind kein Hype-Thema

• Datenbanken & SQL oftmals nicht Kern-Kompetenz von Software-Entwicklern

• ORMs verstecken die Datenbank

(Beispiel: person.getAddress())

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• One-Shot-Database

• Restriktive DBAs

• Restriktive Change-Prozesse

• Legacy-Datenbanken sind meist in schlechtem Zustand (SQL-Antipatterns, Fehler, Inkonsistenzen, keine Dokumentation)

5

Page 6: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Database Engineering

• Datenmodellierung

• Database Reverse Engineering

• Database Refactorings & Transformations

• Database Versioning & Management

• Database Testing

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• Database Testing

• Database Performance Tuning

6

Page 7: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Datenmodellierung

• Conceptual: Identifikation der Entities und ihrer Relationen, Bestandteil der Ubiquitous Language

• Logical: Genauere Auflösung, Festlegung von Attribu ten

ConceptualData Model

LogicalData Model

PhysicalData Model

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• Logical: Genauere Auflösung, Festlegung von Attribu ten

• Physical: Abbildung auf konkrete Datenbank

• Modellierung: EER-Diagramme, UML-Klassendiagramme

• BDUF („Big Design Up Front“) vermeiden• Wasserfallmodell funktioniert nicht• Anforderungen ändern sich• Änderungsprozess von Anfang an definieren

7

Page 8: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Klassifikation von Tabellen I

Table

Data System

AuditHistory

ReferenceLookup

Entity

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery 8

ProtocolLogging

Status

Temporary

JoinMain Sub

Page 9: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Klassifikation von Tabellen II

Unterschiede zwischen Tabellen-Typen:

• Größen-Wachstum

• Handhabung (Archivierung, Migration, Optimierung)

Anwendung:

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

Anwendung:

• Unterstützung bei Datenmodellierung

• Unterstützung bei Database Reverse Engineering

• Wiederherstellung der Applikation („minimale Datenbank“)

• Definition der Test-Datenbank

9

Page 10: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Klassifikation von Tabellen – Beispiel

Order Article_Order Article

Article_CategoryLogin_Log

Customer

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery 10

Address

CityCountry

Article_Audit

Page 11: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Klassifikation von Tabellen – Beispiel

Order<<Main Entity >>

Article_Order<<Join >>

Article<<MainEntity >>

Article_Category<<Reference>>

Login_Log<<Logging>>

Customer<<MainEntity >>

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery 11

<<Main Entity >> <<Join >> <<MainEntity >>

Address<<SubEntity>>

City<<Reference>>

Country<<Reference>>

Article_Audit<<Audit>>

<<MainEntity >>

Page 12: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Klassifikation von Tabellen – Beispiel

Order<<Main Entity >>

Article_Order<<Join >>

Article<<MainEntity >>

Article_Category<<Reference>>

Login_Log<<Logging>>

Customer<<MainEntity >>

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery 12

<<Main Entity >> <<Join >> <<MainEntity >>

Address<<SubEntity>>

City<<Reference>>

Country<<Reference>>

Article_Audit<<Audit>>

<<MainEntity >>

Page 13: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Database Refactorings & Transformations

Database Refactoring: Änderung des Datenbank-Schema s um die Qualität zu verbessern. Keine Erweiterungen, kein Bugfixing

Database Transformation: Änderung des Datenbank-Schemas, um es zu erweitern

Arten:

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

Arten:

• Structural Refactorings

• Data Quality Refactorings

• Referential Integrity Refactorings

• Architectural Refactorings

• Method Refactorings

• Transformations

13

Page 14: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Schwierigkeiten bei Datenbankänderungen

• Abhängigkeit zu Source Code

• Abhängigkeit zu anderen Applikationen

• Test-Code und Test-Daten

• Gleichzeitiger Zugriff von mehreren Servern

• Mangelnde Tool -Unterstützung

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• Mangelnde Tool -Unterstützung

• Änderungen sind teilweise irreversibel

14

Page 15: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Management der Datenbank

Dokumentation der Datenbank

Beispiel Dokumentation von Tabellen:

• Name

• Beschreibung

• Typ

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• Typ

• Wachstumsrate

• Strategie für Historisierung & Archivierung

Datenbank-Kommentare nicht ausreichend

15

Page 16: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Database Versioning

• Kontrollierter Prozess für die Durchführung von Dat abase Refactorings & Transformations

• Aktuelle Version in Datenbank gespeichert

• Jede Änderung führt zu einer neuen Version

• Änderungen sind Bestandteil des Projekt-Codes

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• Anti-Pattern: Keine Verwaltung der Änderungen

• Änderungen: Migrations, Changes, Deltas, Database Script

• Tools: Apache ddlutils, Flyway, Liquibase, dbdeploy

16

Page 17: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Flyway

• Java-Bibliothek für Datenbank-Migrationen

• Verwendung über• Command-Line• Maven• Ant• SBT

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• Gradle• Spring

• Migrationen über• SQL Command Script• Java-Klasse

• Lizenz: Apache Software Licence 2.0

• Website: http://flywaydb.org/17

Page 18: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Flyway - Konfiguration

<plugin>

<groupId>com.googlecode.flyway</groupId>

<artifactId>flyway-maven-plugin</artifactId>

<version>2.3</version>

<configuration>

<driver>org.postgresql.Driver</driver>

<url>jdbc:postgresql://localhost:5432/app</url>

<user>username</user>

<locations>db/migration</locations>

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

<locations>db/migration</locations>

</configuration>

<dependencies>

<dependency>

<groupId>postgresql</groupId>

<artifactId>postgresql</artifactId>

<version>9.2</version>

</dependency>

</dependencies>

</plugin>

18

Page 19: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Flyway - Anwendung

Namensschema:

• SQL: V${ version }__${description }.sql

version description checksum installed_on

1 initial database -11308505 2014-01-27

2 user table added -54829323 2014-01-27

classpath:/db/migration

V1__initial_database.sqlV2__user_table_added.sqlV3_role_table_added.sql

Tabelle SCHEMA_VERSION (vereinfacht)

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• SQL: V${ version }__${description }.sql

• Java: V${version}__${description}

Maven Goals:

• flyway:init – Skripts mit bestehender Datenbank synch ronisieren

• flyway:migrate – Migrationen durchführen

• flyway:history, flyway:info – Informationen zu Migrati onen anzeigen

mvn –Dflyway.password=${passwd} compile flyway:migrat e

19

Page 20: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Liquibase

• Java-Bibliothek für Datenbank-Migrationen

• Verwendung über• Command Line• Ant• Maven• Servlet Listener

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• Spring• CDI

• Zentrale Changelog-Datei mit Changesets

• Zwei Meta-Tables: DATABASECHANGELOG und DATABASECHANGELOGLOCK

• Website: http://www.liquibase.org

• Lizenz: Apache Software Licence 2.020

Page 21: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Liquibase - Features

• Verschiedene Formate für Changelogs (XML, JSON, YAML)

• Definierte Database Refactorings & Transformations

• Mittels Plugins erweiterbar

• Database Diffs

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• Contexts

• Preconditions

• DBDoc

• Database Reverse Engineering zu Changelogs

• SQL-Output

21

Page 22: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Liquibase - Maven

<plugin>

<groupId>org.liquibase</groupId>

<artifactId>liquibase-maven-plugin</artifactId>

<version>3.11</version>

<configuration>

<changeLogFile>src/main/resources/db/changelog.xml</changeLogFile>

<driver>oracle.jdbc.driver.OracleDriver</driver>

<url>jdbc:oracle:thin:@localhost:1521/XE</url>

<username>myuser</username>

<password>password</password>

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

<password>password</password>

<promptOnNonLocalDatabase>true</promptOnNonLocalDatabase>

</configuration>

</plugin>

22

Page 23: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Liquibase - Changelog

<?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-3.1.xsd"

>

<property name="view.dir" value="db/view" />

<include file="${view.dir}/views.xml" />

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

<include file="${view.dir}/views.xml" />

<changeSet />

<changeSet />

</databaseChangeLog>

23

Page 24: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Liquibase - Changeset

<changeSet

id="2014-01-27_01"

author="wolfgang.gruber"

runOnChange="true"

runAlways="false"

context="test">

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

>

<comment>New table added</comment>

<addColumn table="user">

<column name="street" type="VARCHAR(100)" />

</addColumn>

</changeSet>

24

Page 25: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Liquibase – Changes/Refactorings

• createTable, createIndex, createSequence, createVie w

• addColumn, addPrimaryKey, addForeignKey

• dropTable, dropColumn, dropPrimaryKey

• renameTable, renameColumn, renameView

• loadData , loadUpdateData

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• loadData , loadUpdateData

• sql, sqlFile

25

Page 26: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Liquibase - DBDoc

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery 26

Page 27: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Liquibase - Tipps

• Namenskonvention für id und author in den Changesets

• Eine Änderung je Changeset

• Vorsicht bei der Verwendung von context. Wird beim Aufruf kein Kontext angegeben, werden alle Changese tsausgeführt

• Strukturierung des Changelog

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• Strukturierung des Changelog

• Refactorings, Daten, DB-Code voneinander trennen

27

Beispiel für Strukturierung:

/app-changelog.xml/data/data-changelog.xml/data/*.csv/code/code-changelog.xml/code/*.sql/update/update-changelog.xml/update/2014-01-01_01.sql/update/2014-01-10_01.sql

Page 28: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Best Practice

• Eigene Datenbank je Entwickler

• Management von Referenz- und Testdaten

• Automatische Deployments auf Testumgebung

• Database-Backup vor Datenbank-Migrationen

• Eigene User für Datenbank -Migrationen mit mehr Rechten

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

• Eigene User für Datenbank -Migrationen mit mehr Rechten (zB CREATE TABLE)

• Rolling Updates mit mehreren Applikationsservern erfordern spezielle Handhabung (Beispiel: renamecolumn)

28

Page 29: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Zusammenfassung

• Continuous Delivery wird Standard für Release-Prozess

• Datenbank bildet den Kern der Applikation

• Database-Engineering genauso wichtig wie Software-Engineering

• Datenbankmodellierung erforderlich, aber BDUF sollt e vermieden werden

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

vermieden werden

• Database Refactorings bilden die Basis für Datenbank -Evolution

• Die Datenbank muss versioniert sein

• Verschiedene Tools verfügbar

29

Page 30: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Fragen?

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

Fragen?

30

Page 31: Java Student User Group – Meeting 61jsug.at/w/images/4/41/Datenbank-Evolution.pdf · Database Refactoring: Änderung des Datenbank-Schemas um die Qualität zu verbessern. Keine

Vielen Dank für Ihre Aufmerksamkeit!

Evolutionäre Datenbankentwicklung im Rahmen von Continuous Delivery

Vielen Dank für Ihre Aufmerksamkeit!

31