{"id":70973,"date":"2020-02-23T00:58:26","date_gmt":"2020-02-22T21:58:26","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase"},"modified":"2020-03-03T16:14:41","modified_gmt":"2020-03-03T13:14:41","slug":"kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","title":{"rendered":"Comment ne pas se tirer une balle dans le pied en utilisant Liquibase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Jamais vu, et voil\u00e0 encore !<\/p>\n<p><\/p>\n<p>Lors d'un projet r\u00e9cent, nous avons d\u00e9cid\u00e9 d'utiliser Liquibase d\u00e8s le d\u00e9part pour \u00e9viter des probl\u00e8mes \u00e0 l'avenir. Il s'est av\u00e9r\u00e9 que tous les jeunes membres de l'\u00e9quipe ne savent pas l'utiliser correctement. J'ai donc anim\u00e9 un atelier interne que j'ai d\u00e9cid\u00e9 de transformer en article. <\/p>\n<p><\/p>\n<p>Cet article contient des conseils utiles et d\u00e9crit les trois pi\u00e8ges les plus \u00e9vidents dans lesquels on peut tomber en travaillant avec des outils de migration de bases de donn\u00e9es relationnelles, en particulier Liquibase. Il est destin\u00e9 aux d\u00e9veloppeurs Java de niveau Junior et Middle ; pour les d\u00e9veloppeurs plus exp\u00e9riment\u00e9s, cela pourrait \u00eatre int\u00e9ressant pour structurer et revoir ce qui est probablement d\u00e9j\u00e0 connu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Comment ne pas se tirer une balle dans le pied en utilisant Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/f8b3c9a456bde7aa123702fae132b4b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Liquibase et Flyway sont les deux technologies concurrentes principales pour le contr\u00f4le de version des structures relationnelles dans le monde Java. La premi\u00e8re est enti\u00e8rement gratuite et, dans la pratique, elle est souvent choisie pour son utilisation, c'est donc Liquibase qui est mis en avant dans cette publication. Cependant, certaines des pratiques d\u00e9crites peuvent \u00eatre universelles, selon l'architecture de votre application. <\/p>\n<p><\/p>\n<p>Les migrations de structures relationnelles sont une r\u00e9ponse in\u00e9vitable \u00e0 la faible flexibilit\u00e9 des entrep\u00f4ts de donn\u00e9es relationnelles. \u00c0 une \u00e9poque o\u00f9 la mode \u00e9tait \u00e0 la POO, le travail avec les bases de donn\u00e9es impliquait de d\u00e9finir un sch\u00e9ma une fois et de ne plus y toucher. Mais la r\u00e9alit\u00e9 est toujours telle que tout change, et des modifications dans la structure des tables sont souvent n\u00e9cessaires. Naturellement, le processus peut \u00eatre douloureux et d\u00e9sagr\u00e9able. <\/p>\n<p><\/p>\n<p>Je ne vais pas approfondir la technologie ni donner des instructions pour ajouter la biblioth\u00e8que \u00e0 votre projet, de nombreux articles ont d\u00e9j\u00e0 \u00e9t\u00e9 \u00e9crits \u00e0 ce sujet :<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460377\/\">Utilisation de Liquibase pour g\u00e9rer la structure de la base de donn\u00e9es dans une application Spring Boot. Partie 1<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460907\/\">Utilisation de Liquibase pour g\u00e9rer la structure de la base de donn\u00e9es dans une application Spring Boot. Partie 2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436994\/\">Liquibase et Maven<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/330662\/\">Approches pour le versioning des modifications de la base de donn\u00e9es<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/271719\/\">Spring MVC\/Security, REST, Hibernate, Liquibase lanc\u00e9s en deux lignes<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>De plus, il y avait d\u00e9j\u00e0 un excellent article sur les conseils utiles :<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/179425\/\">Utiliser Liquibase sans maux de t\u00eate. 10 conseils de l'exp\u00e9rience de d\u00e9veloppement r\u00e9el<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"sovety\">Si je ne pouvais donner qu'un seul conseil, ce serait celui-ci :<\/h2>\n<p><\/p>\n<p>Je souhaite partager mes conseils et commentaires, qui sont n\u00e9s de la sueur, du sang et de la douleur de r\u00e9soudre des probl\u00e8mes de migration.<\/p>\n<p><\/p>\n<h3 id=\"1--pered-rabotoy-sleduet-oznakomitsya-s-razdelom-luchshih-praktik-na-saytehttpswwwliquibaseorgbestpracticeshtml-liquibase\">1. Avant de commencer, il convient de consulter la section des meilleures pratiques sur <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">site<\/a><\/noindex> Liquibase<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/bestpractices.html\">L\u00e0<\/a><\/noindex> Il s'agit de choses simples mais tr\u00e8s importantes, sans lesquelles l'utilisation de la biblioth\u00e8que peut compliquer votre vie. Par exemple, une approche non structur\u00e9e de la gestion des changelogs conduira t\u00f4t ou tard \u00e0 la confusion et \u00e0 des migrations rompues. Si vous appliquez des modifications inter-d\u00e9pendantes de la structure de la base de donn\u00e9es et de la logique des services sans le faire simultan\u00e9ment, il y a de fortes chances que cela entra\u00eene des tests \u00e9chou\u00e9s ou un environnement cass\u00e9. De plus, les recommandations concernant l'utilisation de Liquibase sur le site officiel contiennent un point sur le d\u00e9veloppement et la v\u00e9rification des scripts de rollback en parall\u00e8le avec les scripts de migration principaux. Enfin, dans l'article <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/178665\/\">https:\/\/habr.com\/ru\/post\/178665\/<\/a><\/noindex> il y a des exemples de code concernant les migrations et le m\u00e9canisme de rollback. <\/p>\n<p><\/p>\n<h3 id=\"2-esli-nachali-ispolzovat-sredstva-migracii--ne-dopuskayte-manualnyh-ispravleniy-v-strukture-bazy\">2. Si vous avez commenc\u00e9 \u00e0 utiliser des outils de migration, n'autorisez pas de corrections manuelles dans la structure de la base.<\/h3>\n<p><\/p>\n<p>Comme on dit : \u00ab Une fois Persil \u2014 toujours Persil \u00bb. Si la base de votre application commence \u00e0 \u00eatre g\u00e9r\u00e9e par Liquibase, toute modification manuelle entra\u00eene instantan\u00e9ment un \u00e9tat incoh\u00e9rent, et le niveau de confiance dans les changelogs tombe \u00e0 z\u00e9ro. Les risques potentiels incluent plusieurs heures pass\u00e9es \u00e0 restaurer la base, et au pire, un serveur fichu. Si dans votre \u00e9quipe se trouve un DBA Architect de la vieille \u00e9cole, expliquez-lui patiemment et attentivement \u00e0 quel point tout ira mal s'il modifie simplement la base selon son propre jugement \u00e0 partir d'un suppos\u00e9 SQL Developer. <\/p>\n<p><\/p>\n<h3 id=\"3-esli-chendzhset-uzhe-byl-zapushen-v-repozitoriy-izbegayte-redaktirovaniya\">3. Si le changelog a d\u00e9j\u00e0 \u00e9t\u00e9 pouss\u00e9 dans le r\u00e9f\u00e9rentiel, \u00e9vitez de le modifier.<\/h3>\n<p><\/p>\n<p>Si un autre d\u00e9veloppeur a fait un pull et a appliqu\u00e9 un changelog qui sera ensuite modifi\u00e9, il vous remerciera sans doute lorsque qu'il obtiendra une erreur au d\u00e9marrage de l'application. Si la modification d'un changelog fuit d'une mani\u00e8re ou d'une autre dans le d\u00e9veloppement \u2014 il faudra cheminer sur une route glissante de correctifs. Le c\u0153ur du probl\u00e8me r\u00e9side dans la validation des changements par la somme de contr\u00f4le \u2014 le m\u00e9canisme principal de Liquibase. Lors de la modification du code d'un changelog, la somme de contr\u00f4le change. La modification des changelogs est possible uniquement lorsqu'il est possible de red\u00e9ployer toute la base sans perte de donn\u00e9es. Dans ce cas, le refactoring du code SQL ou XML peut, au contraire, faciliter la vie et rendre les migrations plus lisibles. Un exemple pourrait \u00eatre la situation o\u00f9, au d\u00e9marrage de l'application, le sch\u00e9ma de la base de donn\u00e9es initiale \u00e9tait convenu au sein de l'\u00e9quipe. <\/p>\n<p><\/p>\n<h3 id=\"4--imey-proverennye-bekapy-baz-dannyh-esli-eto-vozmozhno\">4. Ayez des sauvegardes de bases de donn\u00e9es v\u00e9rifi\u00e9es, si possible.<\/h3>\n<p><\/p>\n<p>Ici, je pense que tout est clair. En cas de migration rat\u00e9e, tout peut \u00eatre restaur\u00e9. Liquibase a un outil de retour en arri\u00e8re, mais les scripts de retour sont \u00e9galement \u00e9crits par le d\u00e9veloppeur, et il peut y avoir des probl\u00e8mes dans ces scripts avec la m\u00eame probabilit\u00e9 que dans les scripts du changelog principal. Cela signifie qu'il est utile de prendre des pr\u00e9cautions avec les sauvegardes dans tous les cas. <\/p>\n<p><\/p>\n<h3 id=\"5-ispolzuy-proverennye-bekapy-baz-dannyh-v-razrabotke-esli-eto-vozmozhno\">5. Utilisez des sauvegardes de bases de donn\u00e9es v\u00e9rifi\u00e9es dans le d\u00e9veloppement, si possible.<\/h3>\n<p><\/p>\n<p>Si cela ne contrevient pas aux contrats et \u00e0 la confidentialit\u00e9, qu'il n'y a pas de donn\u00e9es personnelles dans la base et qu'elle ne p\u00e8se pas lourd \u2014 avant d'appliquer des migrations sur des serveurs en production, vous pouvez v\u00e9rifier comment cela fonctionne sur la machine du d\u00e9veloppeur et identifier presque 100% des probl\u00e8mes potentiels lors de la migration. <\/p>\n<p><\/p>\n<h3 id=\"6-obschaysya-s-drugimi-razrabotchikami-v-komande\">6. Communiquez avec les autres d\u00e9veloppeurs de l'\u00e9quipe.<\/h3>\n<p><\/p>\n<p>Dans un processus de d\u00e9veloppement bien organis\u00e9, tout le monde dans l'\u00e9quipe sait qui fait quoi. En r\u00e9alit\u00e9, ce n'est souvent pas le cas, donc si vous pr\u00e9parez des modifications dans la structure de la base de donn\u00e9es dans le cadre de votre t\u00e2che, il est souhaitable d'en informer toute l'\u00e9quipe. Si quelqu'un fait des modifications en parall\u00e8le, vous devez vous organiser avec pr\u00e9caution. Il est important de communiquer avec vos coll\u00e8gues m\u00eame apr\u00e8s avoir termin\u00e9 le travail, pas seulement au d\u00e9but. De nombreux probl\u00e8mes potentiels avec les changelogs peuvent \u00eatre r\u00e9solus lors de l'examen du code. <\/p>\n<p><\/p>\n<h3 id=\"7-dumay-chto-delaesh\">7. R\u00e9fl\u00e9chissez \u00e0 ce que vous faites !<\/h3>\n<p><\/p>\n<p>Cela semble \u00eatre un conseil \u00e9vident, applicable \u00e0 toutes les situations. Cependant, de nombreux probl\u00e8mes auraient pu \u00eatre \u00e9vit\u00e9s si le d\u00e9veloppeur avait analys\u00e9 une fois de plus ce qu'il faisait et quel impact cela pourrait avoir. Travailler avec des migrations n\u00e9cessite toujours une attention et une prudence suppl\u00e9mentaires. <\/p>\n<p><\/p>\n<h2 id=\"lovushki\">Pi\u00e8ges<\/h2>\n<p><\/p>\n<p>Examinons maintenant les pi\u00e8ges typiques dans lesquels on peut tomber en ne suivant pas les conseils ci-dessus, et que faire en fait ?<\/p>\n<p><\/p>\n<h3 id=\"situaciya-1-dva-razrabotchika-pytayutsya-odnovremenno-dobavlyat-novye-chendzhsety\">Situation 1. Deux d\u00e9veloppeurs essaient d'ajouter simultan\u00e9ment de nouveaux changelogs.<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Comment ne pas se tirer une balle dans le pied en utilisant Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/20706fc970510bc06634fa001a4c7ceb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVassia et Petia veulent cr\u00e9er un changelog version 4, sans savoir l\u2019un de l\u2019autre. Ils ont effectu\u00e9 des modifications dans la structure de la base de donn\u00e9es et ont propos\u00e9 un pull request, avec des fichiers de changelog diff\u00e9rents. Voici le m\u00e9canisme d'action propos\u00e9 :<\/p>\n<p><\/p>\n<h4 id=\"kak-reshat\">Comment r\u00e9soudre<\/h4>\n<p><\/p>\n<ol>\n<li>D'une mani\u00e8re ou d'une autre, les coll\u00e8gues doivent convenir dans quel ordre leurs changelogs doivent \u00eatre appliqu\u00e9s, par exemple, celui de Petia doit \u00eatre appliqu\u00e9 en premier. <\/li>\n<li>Une personne doit ajouter un second changement au sien et marquer le changelog de Vasya avec la version 5. Cela peut \u00eatre fait via Cherry Pick ou un merge soign\u00e9. <\/li>\n<li>Apr\u00e8s les modifications, il est imp\u00e9ratif de v\u00e9rifier la validit\u00e9 des actions effectu\u00e9es.<br \/>\nEn r\u00e9alit\u00e9, les m\u00e9canismes de Liquibase permettent d'avoir dans le d\u00e9p\u00f4t deux changelogs de la version 4, donc vous pouvez laisser les choses telles qu'elles sont. Cela signifie simplement que vous aurez deux modifications de la version 4 avec des noms diff\u00e9rents. Avec cette approche, il devient tr\u00e8s difficile de s'orienter dans les versions de la base de donn\u00e9es par la suite. <\/li>\n<\/ol>\n<p><\/p>\n<p>De plus, Liquibase, tel le foyer des hobbits, renferme de nombreux secrets. L'un d'eux est la cl\u00e9 validCheckSum, introduite avec la version 1.7, qui permet de sp\u00e9cifier une valeur de hachage valide pour un changelog, quelle que soit ce qui est stock\u00e9 dans la base de donn\u00e9es. La documentation <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/changeset.html\">https:\/\/www.liquibase.org\/documentation\/changeset.html<\/a><\/noindex> indique ce qui suit :<\/p>\n<p><\/p>\n<blockquote><p>Ajoutez une somme de contr\u00f4le consid\u00e9r\u00e9e comme valide pour cet ensemble de modifications, ind\u00e9pendamment de ce qui est stock\u00e9 dans la base de donn\u00e9es. Utilis\u00e9 principalement lorsque vous avez besoin de modifier un ensemble de modifications et que vous ne souhaitez pas que des erreurs soient remont\u00e9es sur les bases de donn\u00e9es sur lesquelles il a d\u00e9j\u00e0 \u00e9t\u00e9 ex\u00e9cut\u00e9 (ceci n'est pas une proc\u00e9dure recommand\u00e9e).<\/p><\/blockquote>\n<p>Oui, cette proc\u00e9dure n'est pas recommand\u00e9e. Mais parfois, un puissant magicien de lumi\u00e8re ma\u00eetrise \u00e9galement les techniques sombres. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-2-migraciya-kotoraya-zavisit-ot-dannyh\">Situation 2. Migration d\u00e9pendant des donn\u00e9es<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Comment ne pas se tirer une balle dans le pied en utilisant Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/31a6eebb55278c0631115bf16483c7b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Supposons que vous n'ayez pas la possibilit\u00e9 d'utiliser des sauvegardes des bases sur des serveurs en production. Petya a cr\u00e9\u00e9 un changelog, l'a v\u00e9rifi\u00e9 localement et, avec une grande confiance en sa justesse, a fait une pull request sur le d\u00e9veloppement. Le chef de projet a pris la peine de v\u00e9rifier si Petya l'avait v\u00e9rifi\u00e9, puis a int\u00e9gr\u00e9. Mais le d\u00e9ploiement sur le serveur de d\u00e9veloppement a \u00e9chou\u00e9.<\/p>\n<p><\/p>\n<p>En r\u00e9alit\u00e9, cela peut se produire, et personne n'est \u00e0 l'abri. Cela arrive lorsque les modifications de la structure des tables sont en quelque sorte li\u00e9es \u00e0 des donn\u00e9es sp\u00e9cifiques de la base de donn\u00e9es. \u00c9videmment, si la base de Petya est remplie uniquement de donn\u00e9es de test, elle peut ne pas couvrir tous les cas probl\u00e9matiques. Par exemple, lors de la suppression d'une table, il ressort que des enregistrements dans d'autres tables sont li\u00e9s, par Foreign Key, \u00e0 des enregistrements dans la table supprim\u00e9e. Ou en changeant le type d'une colonne, il appara\u00eet que 100% des donn\u00e9es ne peuvent pas \u00eatre converties au nouveau type. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-1\">Comment r\u00e9soudre<\/h4>\n<p><\/p>\n<ul>\n<li>\u00c9crire des scripts sp\u00e9ciaux qui seront appliqu\u00e9s une seule fois lors de la migration et mettront les donn\u00e9es dans un format appropri\u00e9. C'est une solution g\u00e9n\u00e9rale au probl\u00e8me du transfert de donn\u00e9es vers de nouvelles structures apr\u00e8s application des migrations, mais quelque chose de similaire peut \u00eatre appliqu\u00e9 avant, dans certains cas particuliers. Bien s\u00fbr, cette approche n'est pas toujours disponible, car \u00e9diter des donn\u00e9es sur des serveurs en production peut \u00eatre dangereux et m\u00eame destructeur. <\/li>\n<li>Une autre voie complexe consiste \u00e0 modifier le changelog existant. La difficult\u00e9 r\u00e9side dans le fait que toutes les bases de donn\u00e9es o\u00f9 il a d\u00e9j\u00e0 \u00e9t\u00e9 appliqu\u00e9 dans sa forme actuelle devront \u00eatre restaur\u00e9es. Il est tout \u00e0 fait possible que toute l'\u00e9quipe back-end doive localement recr\u00e9er la base de donn\u00e9es \u00e0 partir de z\u00e9ro. <\/li>\n<li>Et la solution la plus universelle consiste \u00e0 transf\u00e9rer le probl\u00e8me des donn\u00e9es vers l'environnement du d\u00e9veloppeur avec la recr\u00e9ation de la m\u00eame situation et l'ajout d'un nouveau changelog, jusqu'\u00e0 celui qui \u00e9tait cass\u00e9, permettant de contourner le probl\u00e8me.<br \/>\n<img decoding=\"async\" alt=\"Comment ne pas se tirer une balle dans le pied en utilisant Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/b5d28a940a7a35b6cd7a819a8e68f027.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<p>En g\u00e9n\u00e9ral, plus la base de donn\u00e9es est similaire \u00e0 celle du serveur de production, moins il y a de chances que les probl\u00e8mes de migration se produisent largement. Et bien s\u00fbr, avant d'envoyer le changelog dans le d\u00e9p\u00f4t, il vaut mieux r\u00e9fl\u00e9chir plusieurs fois \u00e0 la possibilit\u00e9 qu'il casse quelque chose. <\/p>\n<p><\/p>\n<h3 id=\"situaciya-3-liquibase-nachinaet-primenyatsya-uzhe-posle-vyhoda-v-prodakshn\">Situation 3. Liquibase commence \u00e0 \u00eatre appliqu\u00e9 apr\u00e8s le passage en production<\/h3>\n<p><\/p>\n<p>Supposons que le chef d'\u00e9quipe ait demand\u00e9 \u00e0 P\u00e9tia d'int\u00e9grer Liquibase dans le projet, cependant, le projet est d\u00e9j\u00e0 en production et une structure de base existante existe.<\/p>\n<p><\/p>\n<p>Par cons\u00e9quent, le probl\u00e8me est que sur tous les nouveaux serveurs ou machines des d\u00e9veloppeurs, les donn\u00e9es des tables doivent \u00eatre recr\u00e9\u00e9es \u00e0 partir de z\u00e9ro, tandis que l'environnement existant doit rester dans un \u00e9tat coh\u00e9rent, pr\u00eat \u00e0 accepter de nouveaux changelogs. <\/p>\n<p><\/p>\n<h4 id=\"kak-reshat-2\">Comment r\u00e9soudre<\/h4>\n<p><\/p>\n<p>Il existe \u00e9galement plusieurs voies :<\/p>\n<p><\/p>\n<ul>\n<li>La premi\u00e8re et la plus \u00e9vidente consiste \u00e0 avoir un script distinct qui doit \u00eatre appliqu\u00e9 manuellement lors de l'initialisation d'un nouvel environnement. <\/li>\n<li>La seconde \u2014 moins \u00e9vidente, consiste \u00e0 avoir une migration Liquibase qui se trouve dans un autre contexte Liquibase et \u00e0 l'appliquer. Vous pouvez en lire plus sur le contexte Liquibase ici : <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/contexts.html\">https:\/\/www.liquibase.org\/documentation\/contexts.html<\/a><\/noindex>. Dans l'ensemble, c'est un m\u00e9canisme int\u00e9ressant qui peut \u00eatre appliqu\u00e9 avec succ\u00e8s, par exemple, pour les tests. <\/li>\n<li>Le troisi\u00e8me chemin consiste en plusieurs \u00e9tapes. Tout d'abord, une migration doit \u00eatre cr\u00e9\u00e9e pour les tables d\u00e9j\u00e0 existantes. Ensuite, elle doit \u00eatre appliqu\u00e9e sur un environnement donn\u00e9 pour obtenir son hachage. L'\u00e9tape suivante consiste \u00e0 initialiser sur notre serveur non vide des tables Liquibase vides, et on peut manuellement ins\u00e9rer dans la table \u00e0 l'historique d'application des changements une entr\u00e9e pour un changement \u00ab appliqu\u00e9 \u00bb qui aurait \u00e9t\u00e9 d\u00e9j\u00e0 fait dans la base. Ainsi, sur un serveur existant, l'historique commencera avec la version 2, tandis que tous les nouveaux environnements se comporteront de mani\u00e8re identique.<br \/>\n<img decoding=\"async\" alt=\"Comment ne pas se tirer une balle dans le pied en utilisant Liquibase\" src=\"\/wp-content\/uploads\/2020\/02\/78881ee56a6ee3ba4e0cd1089598c3c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"situaciya-4-migracii-stanovyatsya-ogromnymi-i-ne-uspevayut-vypolnyatsya\">Situation 4. Les migrations deviennent \u00e9normes et ne s'ex\u00e9cutent pas \u00e0 temps.<\/h3>\n<p><\/p>\n<p>Au d\u00e9but du d\u00e9veloppement du service, Liquibase est g\u00e9n\u00e9ralement utilis\u00e9 comme d\u00e9pendance externe, et toutes les migrations sont trait\u00e9es au d\u00e9marrage de l'application. Cependant, avec le temps, vous pouvez rencontrer les cas suivants :<\/p>\n<p><\/p>\n<ul>\n<li>Les migrations deviennent \u00e9normes et prennent beaucoup de temps \u00e0 s'ex\u00e9cuter.<\/li>\n<li>Il devient n\u00e9cessaire de migrer dans des environnements distribu\u00e9s, par exemple sur plusieurs instances de serveurs de bases de donn\u00e9es en m\u00eame temps.<br \/>\nDans ce cas, une application trop longue des migrations entra\u00eenera un timeout au d\u00e9marrage de l'application. De plus, appliquer les migrations pour chaque instance de l'application s\u00e9par\u00e9ment peut entra\u00eener une d\u00e9synchronisation entre les diff\u00e9rents serveurs. <\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"kak-reshat-3\">Comment r\u00e9soudre<\/h4>\n<p><\/p>\n<p>Dans de tels cas, votre projet est d\u00e9j\u00e0 grand, peut-\u00eatre m\u00eame mature, et Liquibase commence \u00e0 fonctionner comme un outil externe ind\u00e9pendant. En effet, Liquibase en tant que biblioth\u00e8que est empaquet\u00e9 dans un fichier jar et peut fonctionner comme d\u00e9pendance \u00e0 l'int\u00e9rieur du projet, ou de mani\u00e8re autonome. <\/p>\n<p><\/p>\n<p>En mode autonome, vous pouvez confier l'application des migrations \u00e0 votre environnement CI\/CD ou aux \u00e9paules solides de vos administrateurs syst\u00e8me\/experts en d\u00e9ploiement. Pour cela, vous aurez besoin de l'interface de ligne de commande de Liquibase. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/documentation\/command_line.html\">https:\/\/www.liquibase.org\/documentation\/command_line.html<\/a><\/noindex>Dans ce mode, il est possible de lancer l'application juste apr\u00e8s que toutes les migrations n\u00e9cessaires aient \u00e9t\u00e9 effectu\u00e9es.<\/p>\n<p><\/p>\n<h2 id=\"vyvod\">Sortie<\/h2>\n<p><\/p>\n<p>En r\u00e9alit\u00e9, il peut y avoir beaucoup plus de pi\u00e8ges lors de la migration des bases de donn\u00e9es, et beaucoup d'entre eux n\u00e9cessitent une approche cr\u00e9ative. Il est important de comprendre que si l'on utilise correctement l'outil, la plupart de ces pi\u00e8ges peuvent \u00eatre \u00e9vit\u00e9s. Personnellement, j'ai rencontr\u00e9 toutes les probl\u00e8mes mentionn\u00e9es sous diff\u00e9rentes formes, et certains d'entre eux \u00e9taient le r\u00e9sultat de mes propres erreurs. En g\u00e9n\u00e9ral, cela se produit, bien s\u00fbr, par inattention, mais parfois \u00e0 cause d'une incapacit\u00e9 criminelle \u00e0 utiliser l'outil.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/epam_systems\/blog\/489198\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0435 \u0432\u0441\u0435 \u043c\u043e\u043b\u043e\u0434\u044b\u0435 \u0447\u043b\u0435\u043d\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u043c\u0435\u044e\u0442 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u042f \u043f\u0440\u043e\u0432\u0451\u043b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0432\u043e\u0440\u043a\u0448\u043e\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u044e. \u0421\u0442\u0430\u0442\u044c\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u044f\u0432\u043d\u044b\u0445 \u043b\u043e\u0432\u0443\u0448\u0435\u043a, \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":70974,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-70973","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043d\u0435 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Liquibase | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-22T21:58:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:41+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Comment \u00e9viter de se tirer une balle dans le pied en utilisant Liquibase | ProHoster","description":"Jamais auparavant, et encore une fois ! Pour ce projet, nous avons d\u00e9cid\u00e9 d'utiliser Liquibase d\u00e8s le d\u00e9but pour \u00e9viter des probl\u00e8mes \u00e0 l'avenir.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043d\u0435 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Liquibase | ProHoster","og:description":"\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0432\u043e\u0442 \u043e\u043f\u044f\u0442\u044c! \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Liquibase \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-ne-vystrelit-sebe-v-nogu-ispolzuya-liquibase","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-22T21:58:26+00:00","article:modified_time":"2020-03-03T13:14:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"70973","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:10:24","updated":"2022-09-28 08:39:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/70973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=70973"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/70973\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/70974"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=70973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=70973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=70973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}