Introduction à la restauration de Liquibase
1. Vue d'ensemble
Dans nosprevious article, nous avons montré Liquibase comme un outil de gestion des schémas et des données de base de données.
Dans cet article, nous allons examiner plus en détail la fonction de restauration et comment nous pouvons annuler une opération Liquibase.
Naturellement, il s’agit d’une caractéristique essentielle de tout système de production.
2. Catégories de migrations Liquibase
Il existe deux catégories d’opérations Liquibase qui entraînent une génération différente d’instruction de restauration:
-
automatic, où la migration peut générer de manière déterministe les étapes nécessaires à la restauration
-
manual, où nous devons émettre une commande d'annulation car l'instruction de migration ne peut pas être utilisée pour identifier l'instruction de manière déterministe
Par exemple,the rollback of a “create table” statement would be to “drop” the created table. Cela peut être déterminé sans aucun doute et, par conséquent, l'instruction de restauration peut être générée automatiquement.
D'autre part,the rollback statement for a “drop table” command is not possible to be determined. Il n’est pas possible de déterminer le dernier état de la table et, par conséquent, l’instruction de restauration ne peut pas être générée automatiquement. These types of migration statements require a manual rollback instructions.
3. Rédaction d'une instruction d'annulation simple
Écrivons un ensemble de modifications simple qui créera une table lors de son exécution et ajoutons une instruction d'annulation à l'ensemble de modifications:
L'exemple ci-dessus fait partie de la première catégorie mentionnée ci-dessus. Il créera automatiquement une déclaration d'annulation si nous n'en ajoutons pas. Mais nous pouvons remplacer le comportement par défaut en créant notre instruction de restauration.
Nous pouvons exécuter la migration en utilisant la commande:
mvn liquibase:update
Après l'exécution, nous pouvons annuler l'action à l'aide de:
mvn liquibase:rollback
Cela exécute le segment d'annulation du jeu de modifications et devrait annuler la tâche effectuée au cours de la phase de mise à jour. Mais si nous émettons cette commande seule, la construction échouera.
La raison en est que nous ne spécifions pas la limite de restauration; la base de données sera complètement effacée en revenant à l'étape initiale. Par conséquent, il est obligatoire de définir l'une des trois contraintes ci-dessous pour limiter l'opération de restauration lorsque la condition est satisfaite:
-
rollbackTag
-
rollbackCount
-
rollbackDate
3.1. Revenir à une balise
Nous pouvons définir un état particulier de notre base de données comme une balise. Par conséquent, nous pouvons faire référence à cet état. Revenir au nom de balise «1.0» ressemble à ceci:
mvn liquibase:rollback -Dliquibase.rollbackTag=1.0
Ceci exécute les instructions de restauration de tous les changesets exécutés après la balise «1.0».
3.2. Recul par nombre
Ici, nous définissons combien de changesets nous devons être annulés. Si nous le définissons comme tel, le dernier jeu de modifications exécuté sera annulé:
mvn liquibase:rollback -Dliquibase.rollbackCount=1
3.3. Revenir à ce jour
Nous pouvons définir une cible d'annulation comme date. Par conséquent, tout jeu de modifications exécuté après ce jour sera annulé:
mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"
Le format de date doit être un format de données ISO ou doit correspondre à la valeur deDateFormat.getDateInstance() de la plate-forme en cours d'exécution.
4. Annuler les options du jeu de modifications
Voyons quelles sont les utilisations possibles de l'instruction d'annulation dans les ensembles de modifications.
4.1. Restauration de plusieurs déclarations
Une seule étiquette d'annulation peut contenir plus d'une instruction à exécuter:
Ici, nous déposons deux tables dans la même balise de restauration. Nous pouvons également répartir la tâche sur plusieurs déclarations.
4.2. Balises de restauration multiples
Dans un changeset, nous pouvons avoir plusieurs balises de restauration. Ils sont exécutés dans l'ordre d'apparition dans changeset:
4.3. Faire référence à un autre ensemble de modifications pour la restauration
Nous pouvons nous référer à un autre ensemble de modifications, éventuellement au jeu de modifications d'origine, si nous souhaitons modifier certains détails de la base de données. Cela réduira la duplication de code et pourra annuler correctement les modifications effectuées:
4.4. Balise de restauration vide
Par défaut, Liquibase essaie de générer un script d'annulation si nous ne l'avons pas fourni. Si nous devons casser cette fonctionnalité, nous pouvons avoir une balise d'annulation vide afin que l'opération d'annulation ne soit pas annulée:
5. Options de la commande de restauration
En plus de restaurer une base de données à un état antérieur, Liquibase peut être utilisé de différentes manières. C’est-à-dire, générer le code SQL de restauration, créer un script de restauration futur, et enfin, nous pouvons tester la migration et la restauration, en une seule étape.
5.1. Générer un script de restauration
Comme pour la restauration, nous avons trois options en main pour générer une restauration SQL. Ce sont:
-
rollbackSQL<tag> - un script pour restaurer la base de données vers la balise mentionnée
-
rollbackToDateSQL<date/time> - un script SQL pour restaurer la base de données à l'état à la date / heure mentionnée
-
rollbackCountSQL<value> - un script SQL pour restaurer la base de données à l'état mentionné par le nombre d'étapes avant
Voyons l'un des exemples en action:
mvn liquibase:rollbackCountSQL 2
5.2. Générer un futur script de restauration
Cette commande génère les commandes SQL d'annulation nécessaires pour amener la base de données à l'état actuel à partir de l'état auquel les ensembles de modifications pouvant être exécutés à ce moment sont terminés. Cela sera très utile s'il est nécessaire de fournir un script d'annulation pour un changement que nous sommes sur le point d'effectuer:
Cela sera très utile s'il est nécessaire de fournir un script d'annulation pour un changement que nous sommes sur le point d'effectuer:
mvn liquibase:futureRollbackSQL
5.3. Exécuter la restauration des tests de mise à jour
Cette commande exécute la mise à jour de la base de données, puis annule les ensembles de modifications pour amener la base de données à l'état actuel. Les annulations futures et les révisions des tests de mise à jour ne modifient pas la base de données actuelle une fois l'exécution terminée. Mais l'annulation de test de mise à jour effectue la migration réelle, puis l'annule.
Ceci peut être utilisé pour tester l'exécution des modifications de mise à jour sans changer de manière permanente la base de données:
mvn liquibase:updateTestingRollback
6. Conclusion
Dans ce rapide didacticiel, nous avons exploré certaines fonctionnalités de ligne de commande et de jeu de modifications de la fonctionnalité de restauration de Liquibase.
Comme toujours, le code source peut être trouvéover on GitHub.