SlideShare a Scribd company logo
1 of 45
Wersjonowanie baz danych
podczas developmentu

Liquibase
Piotr Pelczar
me@athlan.pl
Piotr ’Athlan’ Pelczar
Freelancer: vgroup.pl, athlan.pl
goldenline.pl/piotr-pelczar
me@athlan.pl
Agenda
1.
2.
3.
4.
5.
6.
7.
8.
9.

Problem wersjonowania struktur baz danych
Przedstawienie narzędzia Liquibase
Instalacja
Pierwszy zrzut bazy, tworzenie tagów
Database diff, tag
Rollback
Preconditions
Dobre praktyki
Integracja z Maven i Eclipse
Problem
• Baza danych musi być integralna podczas
developmentu.
• Jak utrzymać jej integralność?
• Jak pozbyć się problemu supportowania
developerów?
• Problem branchowania i mergeowania zmian
wprowadzanych podczas równoległego rozwoju
aplikacji.
Czym jest Liquibase?
•
•
•
•

Niezależna od bazy danych biblioteka.
OpenSource.
Dostępna z linii poleceń.
Do śledzenia i zarządzania zmianami w bazie
danych.
• Zmiany są zapisywane w plikach XML.
Wspierane bazy danych
•
•
•
•
•
•
•
•

MySQL
PostgreSQL
Oracle
MS-SQL
Sybase Enterprise
Sybase Anywhere
DB2
Apache Derby

http://www.liquibase.org/databases
Warto się zapoznać z issues.

•
•
•
•
•
•
•

HSQL
H2
Informix
InterSystems Caché
Firebird
SAPDB
SQLite
Format zmian
•
•
•
•

Jako plik XML
Obsługuje ponad 40 rodzajów zmian
W tym raw SQL, co jest otwartą furktą
Można uruchamiać komendy shell

http://www.liquibase.org/manual/refactoring_commands
Format zmian
Format zmian
• Zmiany są również przechowywane lokalnie w
bazie danych w tabeli databasechangelog
Współbieżność pracy
• Współbieżność jest zagwarantowana poprzez
wpisy w tabeli databasechangeloglock
Uruchamianie Liquibase
Możliwość uruchomienia Liquibase z poziomu:
•
•
•
•
•
•
•

Ant
Maven
Spring Framework (jako bean w kontekście)
Grails
Servlet Listener
Command Line
Integracja z Hibernate
Instalacja
1. http://www.liquibase.org/download
2. Rozpakowujemy
3. Pobieramy odpowiedni driver JDBC do bazy
danych, np. postgresql-9.1-902.jdbc4.jar
Instalacja
4. W bieżącym katalogu tworzymy pusty
liquibase.properties z wpisem:
classpath=D:ProgramsLiquibase
postgresql-9.1-902.jdbc4.jar
Nadpisuje on wartości z linii poleceń, można
zmienić lokalizację za pomocą flagi -defaultsFile
http://www.liquibase.org/manual/command_line#using_a_li
quibaseproperties_file
Wymagania
1. Java 1.5 lub nowsza
2. Poprawnie skonfigurowany classpath oraz
JAVA_HOME
3. Tak, aby Java była dostępna z polecenia:
java -version
4. Liquibase jest uruchamiane jako archiwum
JAR:
java -jar liquibase.jar
Po rozpakowaniu
Pierwszy zrzut bazy danych
liquibase
--url=jdbc:postgresql://localhost:5432/
handlowcy
--username postgres
--password root
--changeLogFile="schema.xml"
generateChangeLog
http://www.liquibase.org/manual/generating_changelogs
Pierwszy zrzut bazy danych
Ograniczenia, w sposób automatyczny nie są
zrzucane:
• Procedury składowane
• Funkcje
• Triggey
• Jest możliwość wykonywania swoich zapytań
SQL, ale nie będą przenośne.
http://www.liquibase.org/manual/generating_changelogs
Załadowanie schematu bazy
liquibase
--url=jdbc:postgresql://localhost:5432/
handlowcy_dev
--username postgres
--password root
--changeLogFile="schema.xml"
update
Wygenerowanie zapytań SQL
liquibase
--url=jdbc:postgresql://localhost:5432/
handlowcy_dev
--username postgres
--password root
--changeLogFile="schema.xml"
updateSQL > changes.sql
Nadeszły zmiany, diff
Sprawdzenie zmian, które nastąpiły:
liquibase
--url=jdbc:postgresql://…
--username postgres
--password root
--referenceUrl=jdbc:postgresql://…
--referenceUsername postgres
--referencePassword root
diff
Nadeszły zmiany, diff
Generujemy zmiany, diffChangeLog
liquibase
--url=jdbc:postgresql://…
--username postgres
--password root
--referenceUrl=jdbc:postgresql://…
--referenceUsername postgres
--referencePassword root
--changeLogFile=changelog-DATE-ath.xml
diffChangeLog
Diff danych
liquibase
--url=jdbc:postgresql://…
--username postgres
--password root
--referenceUrl=jdbc:postgresql://…
--referenceUsername postgres
--referencePassword root
--changeLogFile=changelog-DATE-ath.xml
--diffTypes=data
diffChangeLog
Diff uwagi
Diff obsługuje:
• Missing/unexpected tables, views, columns
• Missing/unexpected primary keys, unique
constraints
• Missing/unexpected foreign Keys
• Missing/unexpected sequences, indexes
• Column definition differences (data type, autoincrement, etc.)
• View definition differences
• Data differences (limited), not checked by
default
Nadeszły zmiany, diff
Diff nie obsługuje:
• Non-foreign key constraints (check, etc)
• Stored Procedures
• Data type length*
* Testowano: Zmiany długości varchar w
PostgreSQL są wykrywane.
Nadeszły zmiany, diff
• Ważnym jest, żeby dobrze interpretować „reference”.
Z naszej perspektywy baza produkcyjna jest główną, a
rererence jest developerska.
Jeżeli odwrócimy, naturalną konsekwencją jest
wygenerowanie DROP’ów zamiast CREATE’ów.
• Umieszczanie daty i nazwy dewelopera w nazwach
plików changelogów to dobry nawyk:
2012-11-24-athlan.xml.
• Przy zbiorczych change’ach pliki te jednoznacznie są
identyfikowane nie tylko w Liquibase, ale na
repozytorium git czy SVN, można je łatwiej mergeować.
Nadeszły zmiany, diff
• Raz wykonany changeSet już nigdy nie zostanie
powtórzony (identyfikowany po author oraz id).
• Nie ma poprawiania XML na repo.
Tagowanie bazy danych
1. W pliku XML
<tagDatabase tag="NAZWA"/>
2. Z poziomu linii poleceń

liquibase
--url=jdbc:postgresql://…
--username postgres
--password root
tag NAZWA
Rollback
Tryb

Komenda

Tryb SQL

Do taga

rollback
<tag>

rollbackSQL
<tag>

Data

rollbackToDate
<date>

rollbackToDateSQL
<date>

Ilość
changeset’ów

rollbackCount
<number>

rollbackCountSQL
<number>
Rollback
liquibase
--url=jdbc:postgresql://…
--username postgres
--password root
rollback tag

rollbackSQL tag > rollback.sql
Rollback
• Większość operacji ma komplementarne sobie
operacje odwrotne.
• Jeżeli nie mają, lub chcemy podjąć inne akcje,
do changeset’a dodajemy tag <rollback>
• Są zapisywane w bazie danych.
Rollback
Rollback
• Przykładowy procedure
Preconditions
Warunki, które muszą być spełnione, aby nastąpił
cały zestaw changeset’ów lub pojedynczy z nich.
Przydają się, gdy:
• Osoba przygotowująca changelog ma jakieś
założenia.
• Zapewnia ich przestrzealność.
• Umożliwia sprawdzenie danch, bądź
parametrów.
• Decyduje, które chengesety są uruchamiane, a
które nie.
Preconditions
Preconditions
Preconditions
Możliwe preconditions:
•
•
•
•
•
•
•

columnExists
•
tableExists
•
•
viewExists
•
indexExists
sequenceExists
primaryKeyExistsdbms
runningAs

changeSetExecuted
sqlCheck
changeLogPropertyDefined
customPrecondition
(className
implementuje interfejs
liquibase.precondition.Cust
omPrecondition)
Dobre praktyki
1. Trzymaj changelog’i spięte <include> zawarte
w master.xml i wykonuj master’a
Integracja z Maven: pom.xml
• Tworzymy główny pom.xml
• Przykład dotyczy modułu common-model
Integracja z Maven: pom.xml
Integracja z Maven: pom.xml
Integracja z Maven: pom.xml
Kompilacja Maven z changesetami:
mvn install:liquibase
Pytania?
1.
2.
3.
4.
5.
6.

Database diff, tag
Rollback
Preconditions
Dobre praktyki
Integracja z Maven i Eclipse
Inne…

Piotr Pelczar
me@athlan.pl
Wersjonowanie baz danych
podczas developmentu

Liquibase
Piotr Pelczar
me@athlan.pl

More Related Content

Similar to Liquibase - database structure versioning

[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?Andrzej Krzywda
 
Specyfikacja modernizacji interfejsu euro sklep
Specyfikacja modernizacji interfejsu   euro sklepSpecyfikacja modernizacji interfejsu   euro sklep
Specyfikacja modernizacji interfejsu euro sklepdan-tom
 
Specyfikacja modernizacji interfejsu euro sklep
Specyfikacja modernizacji interfejsu   euro sklepSpecyfikacja modernizacji interfejsu   euro sklep
Specyfikacja modernizacji interfejsu euro sklepdan-tom
 
Jak tworzyć motywy przyjazne użytkownikom i programistom?
Jak tworzyć motywy przyjazne użytkownikom i programistom?Jak tworzyć motywy przyjazne użytkownikom i programistom?
Jak tworzyć motywy przyjazne użytkownikom i programistom?Tomasz Dziuda
 
Maintenance_Plans_Zupełnie_Znienacka
Maintenance_Plans_Zupełnie_ZnienackaMaintenance_Plans_Zupełnie_Znienacka
Maintenance_Plans_Zupełnie_ZnienackaTobias Koprowski
 
Prezentacja "Praca z Gitem" - Dawid Cieszyński OLMUG 22.01.14
Prezentacja "Praca z Gitem" - Dawid Cieszyński OLMUG 22.01.14Prezentacja "Praca z Gitem" - Dawid Cieszyński OLMUG 22.01.14
Prezentacja "Praca z Gitem" - Dawid Cieszyński OLMUG 22.01.14Sagittario
 
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...PROIDEA
 
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...twitch.tv/katmpb
 
Mongo db baza danych zorientowana dokumentowo
Mongo db  baza danych zorientowana dokumentowo Mongo db  baza danych zorientowana dokumentowo
Mongo db baza danych zorientowana dokumentowo XSolve
 
Poznaj GITa - część teoretyczna - Anna Szwiec
Poznaj GITa -  część teoretyczna - Anna SzwiecPoznaj GITa -  część teoretyczna - Anna Szwiec
Poznaj GITa - część teoretyczna - Anna SzwiecWomen in Technology Poland
 
Wyszukiwanie pełnotekstowe w SQL Server
Wyszukiwanie pełnotekstowe w SQL ServerWyszukiwanie pełnotekstowe w SQL Server
Wyszukiwanie pełnotekstowe w SQL ServerKamil Nowinski
 
20 Joomlasztuczek, które mogą CI się przydać
20 Joomlasztuczek, które mogą CI się przydać20 Joomlasztuczek, które mogą CI się przydać
20 Joomlasztuczek, które mogą CI się przydaćWojciech Klocek
 

Similar to Liquibase - database structure versioning (20)

MongoDB 2011
MongoDB 2011MongoDB 2011
MongoDB 2011
 
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?
 
Badanie skalowalności HBase
Badanie skalowalności HBaseBadanie skalowalności HBase
Badanie skalowalności HBase
 
Specyfikacja modernizacji interfejsu euro sklep
Specyfikacja modernizacji interfejsu   euro sklepSpecyfikacja modernizacji interfejsu   euro sklep
Specyfikacja modernizacji interfejsu euro sklep
 
Specyfikacja modernizacji interfejsu euro sklep
Specyfikacja modernizacji interfejsu   euro sklepSpecyfikacja modernizacji interfejsu   euro sklep
Specyfikacja modernizacji interfejsu euro sklep
 
Sql day2015 fts
Sql day2015 ftsSql day2015 fts
Sql day2015 fts
 
Jak tworzyć motywy przyjazne użytkownikom i programistom?
Jak tworzyć motywy przyjazne użytkownikom i programistom?Jak tworzyć motywy przyjazne użytkownikom i programistom?
Jak tworzyć motywy przyjazne użytkownikom i programistom?
 
Co warto wiedzieć o bazach danych
Co warto wiedzieć o bazach danychCo warto wiedzieć o bazach danych
Co warto wiedzieć o bazach danych
 
Maintenance_Plans_Zupełnie_Znienacka
Maintenance_Plans_Zupełnie_ZnienackaMaintenance_Plans_Zupełnie_Znienacka
Maintenance_Plans_Zupełnie_Znienacka
 
Olga Żądło - Robot Framework
Olga Żądło - Robot FrameworkOlga Żądło - Robot Framework
Olga Żądło - Robot Framework
 
Prezentacja "Praca z Gitem" - Dawid Cieszyński OLMUG 22.01.14
Prezentacja "Praca z Gitem" - Dawid Cieszyński OLMUG 22.01.14Prezentacja "Praca z Gitem" - Dawid Cieszyński OLMUG 22.01.14
Prezentacja "Praca z Gitem" - Dawid Cieszyński OLMUG 22.01.14
 
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...
 
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...
 
Mongo db baza danych zorientowana dokumentowo
Mongo db  baza danych zorientowana dokumentowo Mongo db  baza danych zorientowana dokumentowo
Mongo db baza danych zorientowana dokumentowo
 
M4j2
M4j2M4j2
M4j2
 
M4j2
M4j2M4j2
M4j2
 
Poznaj GITa - część teoretyczna - Anna Szwiec
Poznaj GITa -  część teoretyczna - Anna SzwiecPoznaj GITa -  część teoretyczna - Anna Szwiec
Poznaj GITa - część teoretyczna - Anna Szwiec
 
CVS bez tajemnic
CVS bez tajemnicCVS bez tajemnic
CVS bez tajemnic
 
Wyszukiwanie pełnotekstowe w SQL Server
Wyszukiwanie pełnotekstowe w SQL ServerWyszukiwanie pełnotekstowe w SQL Server
Wyszukiwanie pełnotekstowe w SQL Server
 
20 Joomlasztuczek, które mogą CI się przydać
20 Joomlasztuczek, które mogą CI się przydać20 Joomlasztuczek, które mogą CI się przydać
20 Joomlasztuczek, które mogą CI się przydać
 

More from Piotr Pelczar

Pragmatic Monolith-First, easy to decompose, clean architecture
Pragmatic Monolith-First, easy to decompose, clean architecturePragmatic Monolith-First, easy to decompose, clean architecture
Pragmatic Monolith-First, easy to decompose, clean architecturePiotr Pelczar
 
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIME
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIMEElasticsearch - SEARCH & ANALYZE DATA IN REAL TIME
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIMEPiotr Pelczar
 
[BDD] Introduction to Behat (PL)
[BDD] Introduction to Behat (PL)[BDD] Introduction to Behat (PL)
[BDD] Introduction to Behat (PL)Piotr Pelczar
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsPiotr Pelczar
 
How NOT to write in Node.js
How NOT to write in Node.jsHow NOT to write in Node.js
How NOT to write in Node.jsPiotr Pelczar
 

More from Piotr Pelczar (7)

Pragmatic Monolith-First, easy to decompose, clean architecture
Pragmatic Monolith-First, easy to decompose, clean architecturePragmatic Monolith-First, easy to decompose, clean architecture
Pragmatic Monolith-First, easy to decompose, clean architecture
 
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIME
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIMEElasticsearch - SEARCH & ANALYZE DATA IN REAL TIME
Elasticsearch - SEARCH & ANALYZE DATA IN REAL TIME
 
[BDD] Introduction to Behat (PL)
[BDD] Introduction to Behat (PL)[BDD] Introduction to Behat (PL)
[BDD] Introduction to Behat (PL)
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.js
 
How NOT to write in Node.js
How NOT to write in Node.jsHow NOT to write in Node.js
How NOT to write in Node.js
 
CQRS
CQRSCQRS
CQRS
 
Scalable Web Apps
Scalable Web AppsScalable Web Apps
Scalable Web Apps
 

Liquibase - database structure versioning