SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
Liquibase w praktyce
Mateusz Lubański
JUG Bielsko-Biała
1 września 2016
Mateusz Lubański Liquibase w praktyce 1 września 2016 1 / 30
O mnie
Java Developer 5+
Technologie backendowe
Obecnie pracuje w Omnetric
Fan Agile i Scrum
Hobby: narty/kajaki/trekking//salsa
http://linkedin.com/in/mateuszlubanski
Mateusz Lubański Liquibase w praktyce 1 września 2016 2 / 30
Podstawowe problemy w zarządzaniu bazą
śledzenie zmian
dane słownikowe
dane testowe
automatyzacja
wersjonowanie
niezależny od środowiska
łatwy
Mateusz Lubański Liquibase w praktyce 1 września 2016 3 / 30
Istniejące rozwiązania
Liquibase
złożony
xml, yaml, json, sql
<databaseChangeLog>
<changeSet id=”1” author=”mlubanski”>
<sqlFile path=”V1.sql” />
</changeSet>
<changeSet id=”2” author=”mlubanski”>
<sqlFile path=”V2.sql” />
</changeSet>
<databaseChangeLog>
Flyway
prosty
sql
V1.sql
V2.sql
V3.sql
Mateusz Lubański Liquibase w praktyce 1 września 2016 4 / 30
Integracja
Command Line
Maven
Spring-Boot
Mateusz Lubański Liquibase w praktyce 1 września 2016 5 / 30
Command Line Integration
full command
java −jar ./liquibase−core−3.5.1.jar 
−−driver=org.postgresql.Driver 
−−classpath=./postgresql−9.2−1002−jdbc4.jar 
−−changeLogFile=src/main/resources/db/changelog/db.changelog−master.xml 
−−url=”jdbc:postgresql://localhost:5432/sampledb” 
−−username=sample 
−−password=topsecret 
update
using liquibase.properties
driver: org.postgresql.Driver
classpath: ./postgresql−9.2−1002−jdbc4.jar
url: jdbc:postgresql://localhost:5432/sampledb
username: sample
password: topsecret
java −jar ./liquibase−core−3.5.1.jar 
−−changeLogFile=src/main/resources/db/changelog/db.changelog−master.xml 
update
Mateusz Lubański Liquibase w praktyce 1 września 2016 6 / 30
Maven Integration
dependency
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase−core</artifactId>
<version>3.5.1</version>
</dependency>
plugin
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase−maven−plugin</artifactId>
<version>3.5.1</version>
<configuration>
<propertyFile>src/main/resources/liquibase/liquibase.properties</propertyFile>
<changeLogFile>src/main/resources/db/changelog/db.changelog−master.xml</changeLogFile>
</configuration>
<executions>
<execution>
<goals>
<goal>update</goal>
</goals>
</execution>
</executions>
</plugin>
command
mvn liquibase:update
Mateusz Lubański Liquibase w praktyce 1 września 2016 7 / 30
Spring-Boot Integration
dependency
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase−core</artifactId>
</dependency>
plugin
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring−boot−maven−plugin</artifactId>
</plugin>
application.properties
liquibase.enabled=true
liquibase.change−log=classpath:/db/changelog/db.changelog−master.xml
spring.datasource.url=jdbc:postgresql://localhost:5432/sampledb
spring.datasource.username=sample
spring.datasource.password=secret
command
mvn spring−boot:run
Mateusz Lubański Liquibase w praktyce 1 września 2016 8 / 30
Struktura xml
databaseChangeLog
preConditions
property
changeSet
include
changeSet
comment
preConditions
Any Refactoring Tag(s)
rollback
Mateusz Lubański Liquibase w praktyce 1 września 2016 9 / 30
Pierwszy changeSet
sql
<changeSet id=”1” author=”mlubanski”>
<sqlFile relativeToChangelogFile=”true” path=”sql/create person.sql”/>
</changeSet>
CREATE TABLE person
(
id serial NOT NULL,
name character varying(100) NOT NULL,
date date DEFAULT now(),
CONSTRAINT pk person PRIMARY KEY (id),
CONSTRAINT person name key UNIQUE (name)
);
xml
<changeSet id=”2” author=”mlubanski”>
<createTable tableName=”USER”>
<column name=”ID” type=”int” autoIncrement=”true” >
<constraints primaryKey=”true” nullable=”false” />
</column>
<column name=”NAME” type=”varchar(100)” >
<constraints nullable=”false” unique=”true”/>
</column>
<column name=”DATE” type=”date” defaultValueComputed=”now()”>
<constraints nullable=”false” />
</column>
</createTable>
</changeSet>
Mateusz Lubański Liquibase w praktyce 1 września 2016 10 / 30
Skąd Liquibase wie który skrypt został już wykonany?
id musi być unikalne dla changeLog’a i użytkownika
Liquibase generuje i zapisuje md5sum dla każdego wykonanego
changeSet’a
Główna idea liquibase’a to ciągła liniowa sekwencja zmian na bazie
danych. Podobnie jak przy Versioning Control System nie
modyfikujemy starych commit’ów tak przy liquibas’e nie
modyfikujemy starych changeSet’ów ponieważ możemy zerwać
spójność bazy danych.
Mateusz Lubański Liquibase w praktyce 1 września 2016 11 / 30
Skąd Liquibase wie który skrypt został już wykonany?
DATABASECHANGELOGLOCK (liquibase releaseLocks)
LOCKED
LOCKGRANTED
LOCKEDBY
DATABASECHANGELOG
ID
AUTHOR
FILENAME
DATEEXECUTED
EXECTYPE [EXECUTED, FAILED, SKIPPED, RERAN, MARKRAN]
MD5SUM
DESCRIPTION
Mateusz Lubański Liquibase w praktyce 1 września 2016 12 / 30
Wspierane Refactorings
create: table, view, procedure, sequence, index
add: column, foreign key, not null, unique, default value, primary key,
autoincrement
drop: ...
rename: column, table, view,
others: insert, load data, sql, sqlFile, modify data type, update
Mateusz Lubański Liquibase w praktyce 1 września 2016 13 / 30
Wspierane bazy danych
MySQL
PostgreSQL
Oracle
Sql Server
Sybase
DB2
Apache Derby
HSQL
H2
Informmix
Firebird
SQLite
Mateusz Lubański Liquibase w praktyce 1 września 2016 14 / 30
Wykonywanie tego samego changeSet wielokrotnie
<databaseChangeLog>
<changeSet id=”3” author=”mlubanski” runOnChange=”true”>
<sqlFile path=”deactivate user procedure.sql” splitStatements=”false” />
<rollback>DROP PROCEDURE DEACTIVATE USER;</rollback>
</changeSet>
<changeSet id=”4” author=”mlubanski” runAlways=”true” >
<sqlFile path=”clean deactivated users.sql” splitStatements=”false” />
</changeSet>
<databaseChangeLog>
Mateusz Lubański Liquibase w praktyce 1 września 2016 15 / 30
Wprowadzanie danych
changelog.xml
<changeSet author=”mlubanski” id=”5” runOnChange=”true”>
<loadData tableName=”COUNTRY” file=”data/countries.csv” >
<column name=”name” type=”STRING” />
<column name=”sequence” type=”NUMERIC” />
</loadData>
<rollback>
DELETE FROM COUNTRY;
</rollback>
</changeSet>
countries.csv
name,sequence
Polska,1
Austria,2
Niemcy,3
Anglia,4
Mateusz Lubański Liquibase w praktyce 1 września 2016 16 / 30
Context
changelog.xml
<changeSet author=”mlubanski” id=”5” runOnChange=”true” context=”dev”>
...
</changeSet>
Spring-Boot application.properties
liquibase.contexts=dev
Maven plugin
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase−maven−plugin</artifactId>
<configuration>
<contexts>dev</contexts>
...
</configuration>
</plugin>
Command Line
java −jar ./liquibase−core−3.5.1.jar 
−−changeLogFile=src/main/resources/db/changelog/db.changelog−master.xml 
−−contexts=dev 
update
Mateusz Lubański Liquibase w praktyce 1 września 2016 17 / 30
Preconditions
Warunki zadeklarowane na poziomie changeLog mają globalny zakres do
wszystkich changeSet’ów
<preConditions>
<or>
<dbms type=”h2” />
<dbms type=”mysql” />
</or>
</preConditions>
<changeSet id=”6” author=”mlubanski”>
<preConditions onFail=”WARN”>
<sqlCheck expectedResult=”0”>select count(∗) from oldtable</sqlCheck>
</preConditions>
<dropTable tableName=”oldtable”/>
</changeSet>
onFail: HALT, CONTINUE, MARK RAN, WARN
<changeSet id=”7” author=”mlubanski” dbms=”postgresql”>
<sqlFile path=”insert.sql” />
</changeSet>
Mateusz Lubański Liquibase w praktyce 1 września 2016 18 / 30
Preconditions
Dostępne warunki:
dbms
changeSetExecuted
columnExists, tableExists, viewExists, foreignKeyConstraintExists,
sequenceExists, primaryKeyExists
sqlCheck
changeLogPropertyDefined
customPrecondition
Mateusz Lubański Liquibase w praktyce 1 września 2016 19 / 30
Property and Include
Property:
<property name=”key.type” value=”NUMERIC(10,0)” />
<property name=”name.type” value=”VARCHAR(255)”/>
<property name=”text.type” value=”VARCHAR(2000)” />
<property name=”now” value=”SYSDATE ” dbms=”oracle” />
<property name=”now” value=”NOW()” dbms=”postgresql” />
<changeSet id=”8” author=”mlubanski”>
<createTable tableName=”MESSAGE”>
<column name=”ID” type=”${key.type}” autoIncrement=”true”>
<constraints primaryKey=”true” nullable=”false” />
</column>
<column name=”TITLE” type=”${name.type}”>
<constraints nullable=”false” />
</column>
<column name=”CONTENT” type=”${text.type}” />
<column name=”DATE” type=”date” defaultValueComputed=”${now}”>
<constraints nullable=”false” />
</column>
</createTable>
</changeSet>
Include:
<include file=”R1/db.changelog−master.xml” relativeToChangelogFile=”true” />
<include file=”dev/sample−data.changelog.xml” relativeToChangelogFile=”true” context=”dev” />
Mateusz Lubański Liquibase w praktyce 1 września 2016 20 / 30
Przykładowa struktura
db
changelog
db.changelog.dev.xml
db.changelog.production.xml
R1
data
dictionary.csv
db.changelog.2016-08.20.xml
db.changelog.2016-08.21.xml
db.changelog.master.xml
R2
data
dictionary.csv
db.changelog.2016-08.20.xml
db.changelog.2016-08.21.xml
db.changelog.master.xml
Mateusz Lubański Liquibase w praktyce 1 września 2016 21 / 30
Przykładowa struktura
dbchangelogdb.changelog.dev.xml
<property name=”key.type” value=”NUMERIC(10,0)” />
<property name=”name.type” value=”VARCHAR(255)”/>
...
<include file=”R1/db.changelog.master.xml” relativeToChangelogFile=”true” />
<include file=”R2/db.changelog.master.xml” relativeToChangelogFile=”true” />
dbchangelogR1db.changelog.master.xml
<include file=”db.changelog.2016−08.20.xml” relativeToChangelogFile=”true” />
<include file=”db.changelog.2016−08.20.xml” relativeToChangelogFile=”true” />
Mateusz Lubański Liquibase w praktyce 1 września 2016 22 / 30
Jak wdrożyć liquibase do istniejącego projektu
1 Generujemy changeLog’a (komenda ta nie eksportuje: Stored
procedures, functions, packages, Triggers)
java −jar ./liquibase−core−3.5.1.jar 
db.changelog.xml 
generateChangeLog
2 Odpalamy changelogSync który wypełnia nam tabelę
DATABASECHANGELOG wpisami z changeSet’ów bez wykonywania
ich na bazie
java −jar ./liquibase−core−3.5.1.jar 
db.changelog.xml 
changeLogSync
Mateusz Lubański Liquibase w praktyce 1 września 2016 23 / 30
Przydatne triki
Co gdy admin na powie, że on musi mieć SQL’a? :)
java −jar ./liquibase−core−3.5.1.jar 
src/main/resources/db/changelog/db.changelog−master.xml 
updateSQL > /tmp/script.sql
Czy na pewno baza A jest taka sama jak baza B?
java −jar ./liquibase−core−3.5.1.jar 
diffChangeLog
−−referenceUrl=”jdbc:postgresql://localhost:5432/B” 
−−referenceUsername=sample 
−−referencePassword=topsecret 
> diff.database.changelog.xml
Diff Nie wspiera: Non-foreign key constraints (check, etc), Stored
Procedures, Data type length
Mateusz Lubański Liquibase w praktyce 1 września 2016 24 / 30
Warto wspomnieć?
dbDoc
Current Tables
Authors
Change Logs
Pending Changes
Pending SQL
Most Recent Changes
Rollback
Liczba
Data
Tag
Mateusz Lubański Liquibase w praktyce 1 września 2016 25 / 30
Podsumowanie
śledzenie zmian - spersonalizowane changeSet’y zapisywane w bazie
wraz z dbDoc
dane słownikowe - loadData + .csv
dane testowe - contexts
automatyzacja - libuibase:update
wersjonowanie - include + odpowiednia struktura
niezależny od środowiska - xml
łatwy - umiarkowanie łatwy z wielkimi możliwościami
Mateusz Lubański Liquibase w praktyce 1 września 2016 26 / 30
Demo Time :)
Mateusz Lubański Liquibase w praktyce 1 września 2016 27 / 30
Pytania?
Mateusz Lubański Liquibase w praktyce 1 września 2016 28 / 30
Dziękuję za uwagę :)
Mateusz Lubański Liquibase w praktyce 1 września 2016 29 / 30
Przydatne linki
http://www.liquibase.org/documentation/index.html
http://www.liquibase.org/documentation/changes/
http://projects.spring.io/spring-boot/
http://docs.spring.io/spring-boot/docs/current/reference/html/
common-application-properties.html
http://www.slideshare.net/MateuszLubaski/liquibase-w-praktyce
https://github.com/mlubanski/questionnarie-server
Mateusz Lubański Liquibase w praktyce 1 września 2016 30 / 30

Contenu connexe

En vedette

livreblanc_vicone_19questions
livreblanc_vicone_19questionslivreblanc_vicone_19questions
livreblanc_vicone_19questions
Eric Leclair
 
BH-FY2013-2014
BH-FY2013-2014BH-FY2013-2014
BH-FY2013-2014
Eric He
 
High value manufacturing
High value manufacturingHigh value manufacturing
High value manufacturing
Eric Leclair
 
Alten Zeiten und Jetzt
Alten Zeiten und JetztAlten Zeiten und Jetzt
Alten Zeiten und Jetzt
defneluleci
 
Inconel 600 Flanges
Inconel 600 FlangesInconel 600 Flanges
Inconel 600 Flanges
manufacturerindia
 

En vedette (17)

ACERO DE REFUERZO EDIFICIO
ACERO DE REFUERZO EDIFICIOACERO DE REFUERZO EDIFICIO
ACERO DE REFUERZO EDIFICIO
 
Food processing.
Food processing.Food processing.
Food processing.
 
livreblanc_vicone_19questions
livreblanc_vicone_19questionslivreblanc_vicone_19questions
livreblanc_vicone_19questions
 
Productivity Improvement at 30,000 feet
Productivity Improvement at 30,000 feetProductivity Improvement at 30,000 feet
Productivity Improvement at 30,000 feet
 
Concreto edificio
Concreto edificioConcreto edificio
Concreto edificio
 
Tugas kelompok e commerce
Tugas kelompok e commerceTugas kelompok e commerce
Tugas kelompok e commerce
 
Calculo de concreto de edificio
Calculo de concreto de edificioCalculo de concreto de edificio
Calculo de concreto de edificio
 
BH-FY2013-2014
BH-FY2013-2014BH-FY2013-2014
BH-FY2013-2014
 
Acero refuerzo edificio
Acero refuerzo edificioAcero refuerzo edificio
Acero refuerzo edificio
 
High value manufacturing
High value manufacturingHigh value manufacturing
High value manufacturing
 
unemployment
unemployment unemployment
unemployment
 
Alten Zeiten und Jetzt
Alten Zeiten und JetztAlten Zeiten und Jetzt
Alten Zeiten und Jetzt
 
Carbon Steel Pipe Fittings
Carbon Steel Pipe FittingsCarbon Steel Pipe Fittings
Carbon Steel Pipe Fittings
 
Inconel 600 Flanges
Inconel 600 FlangesInconel 600 Flanges
Inconel 600 Flanges
 
Concreto edificio
Concreto edificioConcreto edificio
Concreto edificio
 
HOW TO EXPORT A PRODUCT
HOW TO EXPORT A PRODUCTHOW TO EXPORT A PRODUCT
HOW TO EXPORT A PRODUCT
 
Wouter De Geest - Ingénieur dans l'avenir - Ingenieurs in de toekomst
Wouter De Geest - Ingénieur dans l'avenir - Ingenieurs in de toekomstWouter De Geest - Ingénieur dans l'avenir - Ingenieurs in de toekomst
Wouter De Geest - Ingénieur dans l'avenir - Ingenieurs in de toekomst
 

Similaire à Liquibase w praktyce

Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
Sofiia Lahoda
 
Migracja I Integracja Bazy
Migracja I Integracja BazyMigracja I Integracja Bazy
Migracja I Integracja Bazy
Przemysław ...
 

Similaire à Liquibase w praktyce (20)

Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
Integracja liquibase ze stroną internetową dla zarządzania bazami danych[авто...
 
Integracja liquibase ze stroną internetową dla zarządzania mapami
Integracja liquibase ze stroną internetową dla zarządzania mapami Integracja liquibase ze stroną internetową dla zarządzania mapami
Integracja liquibase ze stroną internetową dla zarządzania mapami
 
Kurs MySQL i SQL, bazy danych - prezentacja ppt, pdf, porady, trening, kurs i...
Kurs MySQL i SQL, bazy danych - prezentacja ppt, pdf, porady, trening, kurs i...Kurs MySQL i SQL, bazy danych - prezentacja ppt, pdf, porady, trening, kurs i...
Kurs MySQL i SQL, bazy danych - prezentacja ppt, pdf, porady, trening, kurs i...
 
Sql day2015 fts
Sql day2015 ftsSql day2015 fts
Sql day2015 fts
 
Integracja środowiska testowego z użyciem Robot Framework, TrojQA 2014-12-16
Integracja środowiska testowego z użyciem Robot Framework, TrojQA 2014-12-16Integracja środowiska testowego z użyciem Robot Framework, TrojQA 2014-12-16
Integracja środowiska testowego z użyciem Robot Framework, TrojQA 2014-12-16
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
XML w SQL Server w praktyce
XML w SQL Server w praktyceXML w SQL Server w praktyce
XML w SQL Server w praktyce
 
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
 
Środowisko testowe pod REST-a
Środowisko testowe pod REST-aŚrodowisko testowe pod REST-a
Środowisko testowe pod REST-a
 
Migracja I Integracja Bazy
Migracja I Integracja BazyMigracja I Integracja Bazy
Migracja I Integracja Bazy
 
Microsoft Business Intelligence w 2017 roku
Microsoft Business Intelligence w 2017 rokuMicrosoft Business Intelligence w 2017 roku
Microsoft Business Intelligence w 2017 roku
 
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
 
Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?
 
Podstawy ETL z SSIS
Podstawy ETL z SSISPodstawy ETL z SSIS
Podstawy ETL z SSIS
 
university day 1
university day 1university day 1
university day 1
 
Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?
 
Maintenance_Plans_Zupełnie_Znienacka
Maintenance_Plans_Zupełnie_ZnienackaMaintenance_Plans_Zupełnie_Znienacka
Maintenance_Plans_Zupełnie_Znienacka
 
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVCWzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVC
 
Atlassian User Group Lower Silesia BUILDFAILUJE? PRZECIEŻ U MNIE DZIAŁAŁO
Atlassian User Group Lower Silesia BUILDFAILUJE? PRZECIEŻ U MNIE DZIAŁAŁOAtlassian User Group Lower Silesia BUILDFAILUJE? PRZECIEŻ U MNIE DZIAŁAŁO
Atlassian User Group Lower Silesia BUILDFAILUJE? PRZECIEŻ U MNIE DZIAŁAŁO
 
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]
 

Liquibase w praktyce