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...
Problem
• Baza danych musi być integralna podczas
developmentu.
• Jak utrzymać jej integralność?
• Jak pozbyć się problemu...
Czym jest Liquibase?
•
•
•
•

Niezależna od bazy danych biblioteka.
OpenSource.
Dostępna z linii poleceń.
Do śledzenia i z...
Wspierane bazy danych
•
•
•
•
•
•
•
•

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

...
Format zmian
•
•
•
•

Jako plik XML
Obsługuje ponad 40 rodzajów zmian
W tym raw SQL, co jest otwartą furktą
Można uruchami...
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 ...
Instalacja
1. http://www.liquibase.org/download
2. Rozpakowujemy
3. Pobieramy odpowiedni driver JDBC do bazy
danych, np. p...
Instalacja
4. W bieżącym katalogu tworzymy pusty
liquibase.properties z wpisem:
classpath=D:ProgramsLiquibase
postgresql-9...
Wymagania
1. Java 1.5 lub nowsza
2. Poprawnie skonfigurowany classpath oraz
JAVA_HOME
3. Tak, aby Java była dostępna z pol...
Po rozpakowaniu
Pierwszy zrzut bazy danych
liquibase
--url=jdbc:postgresql://localhost:5432/
handlowcy
--username postgres
--password root...
Pierwszy zrzut bazy danych
Ograniczenia, w sposób automatyczny nie są
zrzucane:
• Procedury składowane
• Funkcje
• Triggey...
Załadowanie schematu bazy
liquibase
--url=jdbc:postgresql://localhost:5432/
handlowcy_dev
--username postgres
--password r...
Wygenerowanie zapytań SQL
liquibase
--url=jdbc:postgresql://localhost:5432/
handlowcy_dev
--username postgres
--password r...
Nadeszły zmiany, diff
Sprawdzenie zmian, które nastąpiły:
liquibase
--url=jdbc:postgresql://…
--username postgres
--passwo...
Nadeszły zmiany, diff
Generujemy zmiany, diffChangeLog
liquibase
--url=jdbc:postgresql://…
--username postgres
--password root
--referenceUrl=jd...
Diff danych
liquibase
--url=jdbc:postgresql://…
--username postgres
--password root
--referenceUrl=jdbc:postgresql://…
--r...
Diff uwagi
Diff obsługuje:
• Missing/unexpected tables, views, columns
• Missing/unexpected primary keys, unique
constrain...
Nadeszły zmiany, diff
Diff nie obsługuje:
• Non-foreign key constraints (check, etc)
• Stored Procedures
• Data type lengt...
Nadeszły zmiany, diff
• Ważnym jest, żeby dobrze interpretować „reference”.
Z naszej perspektywy baza produkcyjna jest głó...
Nadeszły zmiany, diff
• Raz wykonany changeSet już nigdy nie zostanie
powtórzony (identyfikowany po author oraz id).
• Nie...
Tagowanie bazy danych
1. W pliku XML
<tagDatabase tag="NAZWA"/>
2. Z poziomu linii poleceń

liquibase
--url=jdbc:postgresq...
Rollback
Tryb

Komenda

Tryb SQL

Do taga

rollback
<tag>

rollbackSQL
<tag>

Data

rollbackToDate
<date>

rollbackToDateS...
Rollback
liquibase
--url=jdbc:postgresql://…
--username postgres
--password root
rollback tag

rollbackSQL tag > rollback....
Rollback
• Większość operacji ma komplementarne sobie
operacje odwrotne.
• Jeżeli nie mają, lub chcemy podjąć inne akcje,
...
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...
Preconditions
Preconditions
Preconditions
Możliwe preconditions:
•
•
•
•
•
•
•

columnExists
•
tableExists
•
•
viewExists
•
indexExists
sequenceExists...
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…

P...
Wersjonowanie baz danych
podczas developmentu

Liquibase
Piotr Pelczar
me@athlan.pl
Liquibase - database structure versioning
Upcoming SlideShare
Loading in...5
×

Liquibase - database structure versioning

253

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
253
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Liquibase - database structure versioning

  1. 1. Wersjonowanie baz danych podczas developmentu Liquibase Piotr Pelczar me@athlan.pl
  2. 2. Piotr ’Athlan’ Pelczar Freelancer: vgroup.pl, athlan.pl goldenline.pl/piotr-pelczar me@athlan.pl
  3. 3. 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
  4. 4. 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.
  5. 5. 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.
  6. 6. 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
  7. 7. 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
  8. 8. Format zmian
  9. 9. Format zmian • Zmiany są również przechowywane lokalnie w bazie danych w tabeli databasechangelog
  10. 10. Współbieżność pracy • Współbieżność jest zagwarantowana poprzez wpisy w tabeli databasechangeloglock
  11. 11. 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
  12. 12. Instalacja 1. http://www.liquibase.org/download 2. Rozpakowujemy 3. Pobieramy odpowiedni driver JDBC do bazy danych, np. postgresql-9.1-902.jdbc4.jar
  13. 13. 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
  14. 14. 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
  15. 15. Po rozpakowaniu
  16. 16. 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
  17. 17. 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
  18. 18. Załadowanie schematu bazy liquibase --url=jdbc:postgresql://localhost:5432/ handlowcy_dev --username postgres --password root --changeLogFile="schema.xml" update
  19. 19. Wygenerowanie zapytań SQL liquibase --url=jdbc:postgresql://localhost:5432/ handlowcy_dev --username postgres --password root --changeLogFile="schema.xml" updateSQL > changes.sql
  20. 20. 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
  21. 21. Nadeszły zmiany, diff
  22. 22. Generujemy zmiany, diffChangeLog liquibase --url=jdbc:postgresql://… --username postgres --password root --referenceUrl=jdbc:postgresql://… --referenceUsername postgres --referencePassword root --changeLogFile=changelog-DATE-ath.xml diffChangeLog
  23. 23. 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
  24. 24. 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
  25. 25. 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.
  26. 26. 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ć.
  27. 27. Nadeszły zmiany, diff • Raz wykonany changeSet już nigdy nie zostanie powtórzony (identyfikowany po author oraz id). • Nie ma poprawiania XML na repo.
  28. 28. 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
  29. 29. Rollback Tryb Komenda Tryb SQL Do taga rollback <tag> rollbackSQL <tag> Data rollbackToDate <date> rollbackToDateSQL <date> Ilość changeset’ów rollbackCount <number> rollbackCountSQL <number>
  30. 30. Rollback liquibase --url=jdbc:postgresql://… --username postgres --password root rollback tag rollbackSQL tag > rollback.sql
  31. 31. 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.
  32. 32. Rollback
  33. 33. Rollback • Przykładowy procedure
  34. 34. 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.
  35. 35. Preconditions
  36. 36. Preconditions
  37. 37. Preconditions Możliwe preconditions: • • • • • • • columnExists • tableExists • • viewExists • indexExists sequenceExists primaryKeyExistsdbms runningAs changeSetExecuted sqlCheck changeLogPropertyDefined customPrecondition (className implementuje interfejs liquibase.precondition.Cust omPrecondition)
  38. 38. Dobre praktyki 1. Trzymaj changelog’i spięte <include> zawarte w master.xml i wykonuj master’a
  39. 39. Integracja z Maven: pom.xml • Tworzymy główny pom.xml • Przykład dotyczy modułu common-model
  40. 40. Integracja z Maven: pom.xml
  41. 41. Integracja z Maven: pom.xml
  42. 42. Integracja z Maven: pom.xml Kompilacja Maven z changesetami: mvn install:liquibase
  43. 43. 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
  44. 44. Wersjonowanie baz danych podczas developmentu Liquibase Piotr Pelczar me@athlan.pl
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×