Gestión de Cambios de BDD con LiquiBase ISC Abril 2012 1
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 2
Contexto Si nunca desarrollamos código sin un control de versiones, por que desarrollamos la BDD sin el? 3
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. 4
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. 5
La problemática del cambio (3/3) Soluciones? 6
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 7
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. 8
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. 9
Entorno Desarrollo 10
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 11
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. 12
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. 13
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. 14
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. 15
Primeros pasos con LiquiBase (1/4) 1º Definir el fichero Changelog db.changelog.xml <?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 2.0.xsd"> </databasechangelog> En este fichero es donde indicamos todos los cambios o Changesets. 16
Primeros pasos con LiquiBase (2/4) 2º - Definir un Changeset. db.changelog.xml <?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 2.0.xsd"> <changeset id="1" author="pau"> <createtable tablename="producto"> <column name="id" type="int"> <constraints primarykey="true" nullable="false"/> </column> <column name="nombre" type="varchar(50)"> <constraints nullable="false"/> </column> <column name="precio" type="double" /> <column name="baja" type="boolean" defaultvalueboolean="false"/> </createtable> </changeset> </databasechangelog> 17
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 18
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. 19
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 (20120401 1), etc. 20
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/xmlschema instance" xsi:schemalocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog 2.0.xsd"> <include file="tablas.changelog.xml" relativetochangelogfile="true" /> <include file="datos.changelog.xml" relativetochangelogfile="true" /> </databasechangelog> 21
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 22
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 '2012 04 01'T'00:00:00' Deshacer los últimos N cambios rollbackcount $ java jar liquibase rollbackcount 1 23
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 24
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/3 create_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 25
Integración con Maven (1/2) pom.xml <plugins> <! Liquibase Plugin > <plugin> <groupid>org.liquibase</groupid> <artifactid>liquibase maven plugin</artifactid> <version>2.0.3</version> <configuration> <propertyfile>src/main/resources/liquibase/liquibase.properties</propertyfile> <promptonnonlocaldatabase>false</promptonnonlocaldatabase> </configuration> <executions> <execution> <phase>process resources</phase> <goals> <goal>update</goal> </goals> </execution> </executions> </plugin> </plugins> http://www.liquibase.org/manual/maven 26
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 27
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> 28
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 29
Sobre el Autor: Software Engineer en ISC Blog: www.lintips.com Email: paucls@gmail.com 30