1. Gestión de Cambios
de BDD con LiquiBase
ISC – Abril 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com
1
2. Agenda
Contexto
La problemática del cambio
¿Qué es LiquiBase?
Características principales de LiquiBase
¿Cómo es la gestión con LiquiBase?
Primeros Pasos
Rolling Back de Cambios
Buenas Prácticas
Acciones de Refactoring disponibles
Integración con Maven
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 2
3. Contexto
¿Si nunca desarrollamos código sin un control de versiones,
por que desarrollamos la BDD sin el?
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 3
4. La problemática del cambio (1/3)
Las BDD son una parte fundamental en la mayoría de los proyectos.
¿Como realizamos el seguimiento de sus cambios?
Necesitamos:
Soportar múltiples desarrolladores.
Soportar ramas y versiones.
Flexibilizar y automatizar como
se aplican los cambios.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 4
5. La problemática del cambio (2/3)
Antes de LiquiBase
Ejecución manual de cambios en el modelo de BDD.
No podíamos garantizar que una BDD se encontrase en
una versión concreta.
Nos era demasiado costoso revertir la BDD a estados
anteriores.
No podíamos garantizar la sincronía entre el modelo de
datos y el modelo de entidades de la aplicación.
Generación manual de documentación sobre el modelo de
datos.
Las incorporaciones de un nuevo miembro al equipo eran
mas costosas.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 5
7. ¿Qué es LiquiBase? (1/3)
LiquiBase es una librería OpenSource (bajo licencia Apache
2.0), independiente de la base de datos, que nos permitirá
realizar el seguimiento, la gestión y aplicación de cambios en
nuestro modelo de datos.
Database Refactoring
Database Change Management
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 7
8. ¿Qué es LiquiBase? (2/3)
Permite aplicar cambios de una forma controlada y
automatizada así como llevar un histórico de los
mismos.
Pensada especialmente para equipos de desarrollo
ágiles, con múltiples desarrolladores y ramas de código.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 8
9. ¿Qué es LiquiBase? (3/3)
Una de las ideas es conseguir que los refactoring o nuevos
desarrollos de código subidos a SVN/CVS, se acompañen del
refactoring del modelo de BDD, es decir subir también los
changesets LiquiBase.
De esta forma cuando el resto de desarrolladores actualicen,
descargaran código y las modificaciones de BDD necesarias para
que este funcione.
Se puede conseguir que aplicar estos cambios sea casi
transparente para los desarrolladores, ya que LiquiBase puede
utilizarse no solo desde una linea de comandos, si no también
mediante tareas Ant o mediante Maven.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 9
10. Entorno Desarrollo
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 10
11. Características principales de LiquiBase
LiquiBase soporta:
Extensiones
Fusionar (merge) cambios de múltiples desarrolladores
Ramificaciones de código
Múltiples Bases de Datos
Gestionar datos en producción como también en varias etapas de
testeo y desarrollo
Cluster-safe database upgrades
Actualizaciones automáticas o generación de scripts SQL que pueden
ser aprobadas y aplicadas por un DBA
Deshacer actualizaciones
Revisar diferencias entre versiones ("diff"s)
Generar logs de cambios iniciales desde bases de datos existentes
Generación de documentación de cambios de bases de datos
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 11
12. ¿Cómo es la gestión con LiquiBase? (1/4)
No es una herramienta “diff”.
Trabaja de forma diferente a los tradicionales herramientas de
versionado de esquemas.
Almacena una lista de los cambios aplicados.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 12
13. ¿Cómo es la gestión con LiquiBase? (2/4)
LiquiBase utiliza ficheros XML para describir los cambios
(changesets), lo que permite independencia del sistema de
BDD utilizado. Un changeset se identifica por su id y author,
así como por el propio nombre del fichero.
Cuando aplicamos un changeset, LiquiBase a parte de realizar
las modificaciones pertinentes, registra una entrada con el
cambio en su tabla de histórico DatabaseChangeLog. De
hecho, antes de aplicar un changeset, se comprueba con
dicha tabla que este no se ha realizado previamente.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 13
14. ¿Cómo es la gestión con LiquiBase? (3/4)
LiquiBase utiliza dos tablas:
databasechangelock
Utilizada para controlar la concurrencia.
databasechangelog
Para el registro de cambios aplicados.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 14
15. ¿Cómo es la gestión con LiquiBase? (4/4)
Ya que todos los cambios en la base de datos son almacenados en
un formato legible para los humanos (changesets), permite también
su seguimiento y control el sistema de control de versiones.
Podemos utilizar LiquiBase directamente como una herramienta de
comandos, o configurarla como un plugin de Ant o de Maven.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 15
16. Primeros pasos con LiquiBase (1/4)
1º – Definir el fichero Changelog
db.changelog.xml
<?xml version="1.0" encoding="UTF8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">
</databaseChangeLog>
En este fichero es donde indicamos todos los cambios o Changesets.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 16
18. Primeros pasos con LiquiBase (3/4)
3º – Aplicar el Changeset
Podemos ejecutar el Changeset de varias formas: mediante
linea de comandos, Ant, Maven, Grails, etc.
Por ejemplo desde linea de comandos contra una BDD
MySql.
java jar liquibase.jar driver=com.mysql.jdbc.Driver
classpath=lib/mysql.jar
changeLogFile=db.changelog.xml
url="jdbc:mysql://localhost/db_example"
username=user
password=password
logLevel=info
update
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 18
19. Primeros pasos con LiquiBase (4/4)
4º – Revisar la BDD
Podemos revisar que el cambio se ha realizado en nuestra
BDD.
Y que este queda registrado en la tabla
databasechangelog.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 19
20. Buenas Prácticas (1/3)
Añadir comentarios a los changesets.
<changeSet id="2" author="pau">
<comment>Se añade columna descripcion a tabla producto</comment>
<alterTable tableName="producto">
<column name="descripcion" type="varchar(100)" />
</createTable>
</changeSet>
Seguir siempre el mismo criterio para los IDs. Puede ser un
numero (1), una fecha y numero (201204011), etc.
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 20
21. Buenas Prácticas (2/3)
Organizar los ChangeLogs.
Utilizar una estructura de directorios y nombres de fichero.
Utilizar includes en db.changelog.xml
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog2.0.xsd">
<include file="tablas.changelog.xml" relativeToChangelogFile="true" />
<include file="datos.changelog.xml" relativeToChangelogFile="true" />
</databaseChangeLog>
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 21
22. Buenas Prácticas (3/3)
Utilizar el fichero de propiedades liquibase.properties
Nos evita tener que pasar los parámetros de conexión a la
BDD, en cada llamada a la herramienta liquibase.
driver=com.mysql.jdbc.Driver
classpath=lib/mysql.jar
changeLogFile=db.changelog.xml
url=jdbc:mysql://localhost/db_example
username=user
password=password
logLevel=info
De esta forma llamamos a liquibase indicando únicamente
la acción.
$ java jar liquibase update
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 22
23. Rolling Back de Cambios
Crear Tags “tag”
$ java jar liquibase tag v0.1
Deshacer todos los cambios hasta el Tag indicado “rollback”
$ java jar liquibase rollback v0.1
Deshacer todos los cambios hasta fecha “rollbackToDate”
$ java jar liquibase rollbackToDate '20120401'T'00:00:00'
Deshacer los últimos N cambios “rollbackCount”
$ java jar liquibase rollbackCount 1
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 23
24. Acciones de Refactoring disponibles (1/2)
LiquiBase permite definir todo tipo de modificaciones
mediante su sintaxis XML.
Add Column Create View
Rename Column Rename View
Modify Column Drop View
Drop Column Merge Columns
Alter Sequence Create Stored Procedure
Create Table Insert
Rename Table Etc ...
Drop Table
Imprescindible revisar la documentación oficial
www.liquibase.org/manual/refactoring_commands
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 24
25. Acciones de Refactoring disponibles (2/2)
También permite incluir cambios mediante ficheros SQL.
db.changelog.xml
<changeSet id="3" author="pau">
<comment>Se crea nueva tabla usuarios</comment>
<sqlFile path="sql/3create_usuarios.sql">
<rollback>
<dropTable tableName="usuarios"/>
</rollback>
</changeSet>
3-create_usuarios.sql
CREATE TABLE usuarios (
Id int PRIMARY KEY,
Nombre varchar(50)
);
Si utilizamos SQL, debemos encargarnos nosotros de indicar las acciones de rollback
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 25
27. Integración con Maven (2/2)
Por defecto durante el build del proyecto maven llamará a
liquibase con la acción update.
Pero podemos invocar directamente al plugin para hacer uso
de otras acciones. Ejemplos:
$ mvn liquibase:update
$ mvn liquibase:rollback Dliquibase.rollbackCount=1
$ mvn liquibase:tag Dliquibase.tag=v2.0
$ mvn liquibase:help
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 27
28. Novedades en versión 2.0.4
Se esta trabajando ya en Liquibase 3.0.
La última versión estable es Liquibase 2.0.4, liberada el
pasado 19 de Abril.
Principalmente incluye correcciones de errores, pero entre las
nuevas funcionalidades podemos destacar la posibilidad de
insertar datos de tipo blob/clob.
<insert tableName="TEST_BLOB">
<column name="a_blob" valueBlob="imagen.png" />
</insert>
<insert tableName="TEST_CLOB">
<column name="a_clob" valueClob="texto.txt" />
</insert>
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 28
29. Referencias
http://www.liquibase.org
http://www.liquibase.org/quickstart
http://blog.liquibase.org
Liquibase - Gestión De Cambios En BDD
Getting the most out of LiquiBase
Liquibase – Maven plugin
Lintips
ISC - 2012
Paulo Clavijo Esteban
clavijo_pau@ingenieriadesoftware.com 29
30. Sobre el Autor:
Paulo Clavijo Esteban
Software Engineer en ISC
clavijo_pau@ingenieriadesoftware.com
Blog: www.lintips.com
Email: paucls@gmail.com
30