===== Présentation ===== Liquibase est un gestionnaire de mise à jour de base de donnée Il permet la mise à jour du schéma et des données. Le principe consiste à créer pour chaque évolution un "changelog" (c'est un fichier xml) et de le référencer dans le fichier de gestion des révisions, en général nommé master.xml. Ce changelog ne sera joué qu'une seule fois (si il réussit) Il faut tout de suite rentrer un peu plus dans les détails : master.xml contient des fichier changelogs changelog, qui contient des changeset changeset id=XXXXX, qui contient changeset entries qui sont fait les actions de modifications de la base Pour fonctionner, liquibase va créer 2 tables supplémentaire dans la base de données : === Table databasechangelog === {{::liquibase_table_databasechangelog.jpg?700|}} // La description est parlante, à part le md5sum ; il est créé pour chaque changelog, lors de son exécution // Il s'agit d'une empreinte générée à partir des éléments du fichier xml changelog touchant à la base // de donnée (i.e le contenu des changeset entry) ; les autres éléments sont ignorés du calcul. // Cela permet de l'authentifier. // Pendant son exécution, liquibase recalcule l'empreinte md5 tous les changelogs déjà exécutés et s'assure // qu'il correspondent bien à celui historisé en base dans la table datachangelog. // Cela démontre qu'aucun changesetlog n'a été modifié. Si il en trouve un, alors // il plantera en fournissant la stacktrace ci-dessous. 1 change sets check sum classpath:config/liquibase/changelog/00000000000000_initial_schema.xml::00000000000001::jhipster is now: 7:c544e5ee3ae4aae8b6a8d0b554712f3a liquibase.exception.ValidationFailedException: Validation Failed: 1 change sets check sum classpath:config/liquibase/changelog/00000000000000_initial_schema.xml::00000000000001::jhipster is now: 7:c544e5ee3ae4aae8b6a8d0b554712f3a at liquibase.changelog.DatabaseChangeLog.validate(DatabaseChangeLog.java:215) at liquibase.Liquibase.update(Liquibase.java:208) at liquibase.Liquibase.update(Liquibase.java:192) at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:434) ... Si aucun changelog exécuté n'a été modifié, et qu'un nouveau changelog doit être exécuté, alors liquibase tentera d'exécuter le nouveau changelog. Il ne l'inscrira en base que si l'exécution complète n'a pas posée de problèmes. === Table databasechangeloglock === {{::liquibase_table_databasechangeloglock.jpg?100|}} Elle empêche certainement que 2 liquibase tournent en même temps sur la même base. === Le fichier master.xml === /> A noter que relativeToChangelogFile ne sert qu'à préciser si le chemin indiqué pour ce changelog est relatif au dossier de master.xml ===== Mise en place ===== ==== Dépendances ==== org.liquibase liquibase-core 3.4.2 com.mattbertolini liquibase-slf4j 2.0.0 compile ==== Plugins maven ==== org.liquibase liquibase-maven-plugin 3.4.2 org.javassist javassist 3.18.2-GA compile org.liquibase.ext liquibase-hibernate4 3.5 compile org.springframework.boot spring-boot-starter-data-jpa 1.4.1.RELEASE compile src/main/resources/config/liquibase/master.xml src/main/resources/config/liquibase/changelog/20180105220221_changelog.xml com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/testify_jhi testify_jhi root root hibernate:spring:fr.softeam.testify.domain?dialect=org.hibernate.dialect.MySQL5InnoDBDialect&hibernate.ejb.naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy true debug ===== Lancer liquibase sur son projet ===== ==== Lancer l'application si liquibase est activé au démarrage de l'application ==== Il est aussi possible de lancer liquibase au lancement de l'application web. Cela se fait en utilisant la classe SpringLiquibase par exemple. Pour plus d'info, voir l'article projet testify ==== Lancer liquibase avec maven ==== E1 : Trouver le plugin liquibase dans le pom.xml du projet testify_jhi : org.liquibase liquibase-maven-plugin 3.4.2 Ajouter au plugin liquibase les exécutions suivantes : process-resources update src/main/resources/config/liquibase/master.xml src/main/resources/config/liquibase/changelog/20180117163143_changelog.xml com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/testify_jhi testify_jhi root root hibernate:spring:fr.softeam.testify.domain?dialect=org.hibernate.dialect.MySQL5InnoDBDialect&hibernate.ejb.naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy true debug E2 : Sous eclipse, indiquer Workspace : ${workspace_loc:/testify_jhi} Goals : org.liquibase:liquibase-maven-plugin:update ==== Lancer liquibase en ligne de commande ==== Prerequis : - connaitre le driver mysql ou oracle à utiliser, l'url de la base de donnée, compte et mot de passe - connaitre l'emplacement de son fichier master.xml, et le dossier où sont placés les changelogs - connaitre le jar core de liquibase, contenant un manifest avec une MainClass pour la commandline - créer un fichier liquibase.properties contenant les infos précédentes Voici mon fichier driver: com.mysql.jdbc.Driver classpath: C:/Users/xavier/.m2/repository/mysql/mysql-connector-java/5.1.39/mysql-connector-java-5.1.39.jar;D:/Programmation/java/Projet/testify_jhi/src/main/resources url: jdbc:mysql://localhost:3306/testify_jhi username: root password: root Exécuter : java -jar /liquibase-core-3.4.2.jar --changeLogFile="./config/liquibase/master.xml" validate Il est aussi possible de ne pas se servir du fichier liquibase.properties et de passer tous les paramètres : java -jar /liquibase-core-3.4.2.jar \ --driver=com.mysql.jdbc.Driver \ --url=jdbc:mysql://localhost:3306/testify_jhi \ --username=root \ --password=root \ --classpath: /mysql-connector-java-5.1.39.jar;D:/Programmation/java/Projet/testify_jhi/src/main/resources \ --changeLogFile="./config/liquibase/master.xml" \ update ===== Forcer à recalculer un checksum ===== ==== Manuellement, en SQL ==== E1 : Faire ses modif dans le changetset d'id le fichier xml changelog, et enregistrer le fichier E2 : Relancer liquibase (validate ou update) Normalement, il devrait planter en indiquant que le fichier xml a été modifié et en fournissant le nouveau MD5 du changeset Dans ce cas là, liquibase s'arrête et ne fera aucune update. E3 : update databasechangelog set md5sum= where id=; commit; E4 : Relancer liquibase ; cette fois-ci tout devrait être bon ==== Via la ligne de commande ==== java -jar /liquibase-core-3.4.2.jar --changeLogFile="./config/liquibase/master.xml" clearCheckSums Normalement, à la prochaine exécution de liquibase, tous les md5 sont regénérés. Attention : clearCheckSums vide les MD5 de *TOUS* les changelogs ===== Notion de tag et de retour arrière ===== Il est possible de tagguer un état de la base. Cela permet de faire des retour arrière ("rollback") pour remettre la base de donnée dans l'état où elle était à un tag donné. ===== Ajout d'un changelog ===== Il suffit d'ajouter une ligne dans le fichier master.xml : De créer le fichier xml qui contient les instructions de modifications en base à exécuter. Ces instructions sont donc des tags xml, le site de liquibase fournit la syntaxe. Suite à cela, en relancant liquibase par l'application ou en standalone, liquibase va identifier ce nouveau changelog, l'inscrire dans la table databasechangelog et tenter de l'exécuter. Remarque importante : Le changelog ne sera inséré en base que si liquibase a réussi à complètement le jouer. ==> Il commit donc les changements en base par exécution de changelog entier. ==> Cela permet de travailler à le faire passer en toute sécurité.