Comment gérer les mises à niveau de schéma vers une base de données de production ?

StackOverflow https://stackoverflow.com/questions/29744

  •  09-06-2019
  •  | 
  •  

Question

Cela semble être un domaine négligé qui pourrait vraiment nécessiter quelques éclaircissements.Quelles sont vos bonnes pratiques pour :

  • faire une procédure de mise à niveau
  • recul en cas d'erreur
  • synchronisation des modifications du code et de la base de données
  • tests avant le déploiement
  • mécanique de modification de la table

etc...

Était-ce utile?

La solution

C'est une excellente question.(Il y a de fortes chances que cela aboutisse à un débat sur les bases de données normalisées ou dénormalisées... que je ne vais pas commencer...ok maintenant, quelques commentaires.)

quelques choses qui me viennent à l'esprit (j'en ajouterai d'autres lorsque j'aurai un peu plus de temps ou que j'aurai besoin d'une pause)

conception du client - c'est là que la méthode VB de SQL en ligne (même avec des instructions préparées) vous pose des problèmes.Vous pouvez passer des années à trouver ces déclarations.Si vous utilisez quelque chose comme Hibernate et mettez autant de SQL dans des requêtes nommées, vous disposez d'un seul emplacement pour la plupart du SQL (rien de pire que d'essayer de tester le SQL qui se trouve à l'intérieur d'une instruction IF et vous n'appuyez tout simplement pas sur le "déclencheur". critères dans vos tests pour cette instruction IF).Avant d'utiliser Hibernate (ou d'autres orms), lorsque je ferais du SQL directement dans JDBC ou ODBC, je mettrais toutes les instructions SQL soit en tant que champs publics d'un objet (avec une convention de dénomination), soit dans un fichier de propriétés (également avec un nom convention pour les valeurs, disons PREP_STMT_xxxx.Et utilisez la réflexion ou parcourez les valeurs au démarrage dans a) les cas de test b) le démarrage de l'application (certains rdbms vous permettent de précompiler avec des instructions préparées avant l'exécution, donc au démarrage après la connexion, je précompilerais la préparation- stmts au démarrage pour effectuer l'auto-test de l'application.Même pour des centaines de déclarations sur un bon rdbms, cela ne prend que quelques secondes.et une seule fois.Et cela m’a beaucoup sauvé les fesses.Sur un projet, les DBA ne communiquaient pas (une autre équipe, dans un autre pays) et le schéma semblait changer TOUTES LES NUIT, sans raison.Et chaque matin, nous recevions une liste exacte des endroits où l'application avait été interrompue, au démarrage.

Si vous avez besoin d'une fonctionnalité ad hoc, placez-la dans une classe bien nommée (c.-à-d.encore une fois, une convention de dénomination facilite les tests automatisés) qui agit comme une sorte d'usine pour votre requête (c.-à-d.il construit la requête).Vous devrez de toute façon écrire le code équivalent, il suffit de le placer dans un endroit où vous pourrez le tester.Vous pouvez même écrire des méthodes de test de base sur le même objet ou dans une classe distincte.

Si vous le pouvez, essayez également d'utiliser des procédures stockées.Ils sont un peu plus difficiles à tester comme ci-dessus.Certaines bases de données ne pré-valident pas non plus le SQL dans les procédures stockées par rapport au schéma au moment de la compilation uniquement au moment de l'exécution.Cela implique généralement, par exemple, de prendre une copie de la structure du schéma (pas de données), puis de créer tous les processus stockés par rapport à cette copie (au cas où l'équipe de base de données effectuant les modifications n'aurait pas validé correctement).Ainsi, la structure peut être vérifiée.mais en tant que point de gestion du changement, les processus stockés sont excellents.Au changement, tout le monde comprend.Surtout lorsque les modifications de la base de données résultent de modifications des processus métier.Et toutes les langues (java, vb, etc. obtiennent la monnaie)

En général, je configure également une table que j'utilise appelée system_setting, etc.Dans ce tableau nous conservons un identifiant VERSION.Ceci afin que les bibliothèques clientes puissent se connecter et valider si elles sont valides pour cette version du schéma.En fonction des modifications apportées à votre schéma, vous ne souhaitez pas autoriser les clients à se connecter s'ils peuvent corrompre votre schéma (c.-à-d.vous n'avez pas beaucoup de règles référentielles dans la base de données, mais sur le client).Cela dépend si vous allez également avoir plusieurs versions client (ce qui se produit dans les applications NON Web, c'est-à-dire.ils exécutent le mauvais binaire).Vous pouvez également avoir des outils par lots, etc.Une autre approche que j'ai également utilisée consiste à définir un ensemble de schémas pour les versions d'opération dans une sorte de fichier de propriétés ou encore dans une table system_info.Ce tableau est chargé lors de la connexion, puis utilisé par chaque "gestionnaire" (j'ai généralement une sorte d'API côté client pour effectuer la plupart des tâches de base de données) pour valider cette opération s'il s'agit de la bonne version.Ainsi, la plupart des opérations peuvent réussir, mais vous pouvez également échouer (lancer une exception) sur des méthodes obsolètes et vous indiquer POURQUOI.

gérer la modification du schéma -> mettez-vous à jour la table ou ajoutez-vous des relations 1-1 aux nouvelles tables ?J'ai vu beaucoup de magasins qui accèdent toujours aux données via une vue pour cette raison.Cela permet de modifier les noms des tables, les colonnes, etc.J'ai joué avec l'idée de traiter les vues comme des interfaces dans COM.c'est à dire.vous ajoutez une nouvelle VUE pour les nouvelles fonctionnalités/versions.Souvent, ce qui vous amène ici, c'est que vous pouvez avoir de nombreux rapports (en particulier les rapports personnalisés de l'utilisateur final) qui adoptent des formats de tableau.Les vues vous permettent de déployer un nouveau format de tableau mais prennent en charge les applications client existantes (rappelez-vous tous ces rapports ad hoc embêtants).

Vous devez également écrire des scripts de mise à jour et de restauration.et encore TEST, TEST, TEST...

------------ OK - C'EST UN TEMPS DE DISCUSSION UN PEU ALÉATOIRE --------------

J'avais en fait un grand projet commercial (c.-à-d.boutique de logiciels) où nous avons eu le même problème.L'architecture était à 2 niveaux et ils utilisaient un produit un peu comme PHP mais pré-php.Même chose.nom différent.de toute façon je suis arrivé en version 2....

Cela coûtait BEAUCOUP D'ARGENT pour effectuer des mises à niveau.Beaucoup.c'est à dire.offrez des semaines de temps de consultation gratuit sur place.

Et on en arrivait au point de vouloir soit ajouter de nouvelles fonctionnalités, soit optimiser le code.Une partie du code existant utilisait des procédures stockées, nous avions donc des points communs sur lesquels nous pouvions gérer le code.mais d'autres domaines étaient ce balisage SQL intégré en HTML.Ce qui était idéal pour une commercialisation rapide, mais à chaque interaction de nouvelles fonctionnalités, le coût de test et de maintenance doublait au moins.Ainsi, lorsque nous cherchions à extraire le code de type php, à insérer des couches de données (c'était en 2001-2002, avant tout ORM, etc.) et à ajouter de nombreuses nouvelles fonctionnalités (commentaires des clients), nous avons examiné la question de savoir comment concevoir des MISES À NIVEAU. dans le système.Ce qui est un gros problème, car les mises à niveau coûtent beaucoup d’argent pour être effectuées correctement.Maintenant, la plupart des modèles et tous les autres sujets dont les gens discutent avec un certain degré d'énergie concernent le code OO en cours d'exécution, mais qu'en est-il du fait que vos données doivent a) s'intégrer à cette logique, b) la signification et aussi la structure de les données peuvent changer au fil du temps, et souvent, en raison de la façon dont les données fonctionnent, vous vous retrouvez avec de nombreux sous-processus/applications dans l'organisation de vos clients qui ont besoin de ces données -> rapports ad hoc ou tout rapport personnalisé complexe, ainsi que des tâches par lots qui ont été effectués pour les flux de données personnalisés, etc.

C'est dans cet esprit que j'ai commencé à jouer avec quelque chose d'un peu à gauche.Il comporte également quelques hypothèses.a) les données sont davantage lues qu'écrites.b) les mises à jour ont lieu, mais pas au niveau des banques, c'est-à-dire.un ou deux par seconde, dites.

L'idée était d'appliquer une vue COM/Interface à la façon dont les clients accédaient aux données sur un ensemble de tables CONCRETE (qui variaient en fonction des changements de schéma).Vous pouvez créer une vue séparée pour chaque opération de type : mettre à jour, supprimer, insérer et lire.C'est important.Les vues seraient soit mappées directement sur une table, soit vous permettraient de déclencher une table factice qui effectue les vraies mises à jour ou insertions, etc.Ce que je voulais en fait, c'était une sorte d'indirection de niveau captable qui pourrait toujours être utilisée par les rapports Crystal, etc.REMARQUE - Pour les insertions, les mises à jour et les suppressions, vous pouvez également utiliser des procédures stockées.Et vous aviez une version pour chaque version du produit.De cette façon, votre version 1.0 avait sa version du schéma, et si les tables changeaient, vous auriez toujours les VUES de la version 1.0 mais avec une NOUVELLE logique backend pour mapper les nouvelles tables selon les besoins, mais vous aviez également des vues de la version 2.0 qui prendraient en charge nouveaux champs, etc.Il s'agissait en réalité simplement de prendre en charge les rapports ad hoc, ce qui, si vous êtes une personne COMMERCIALE et non un codeur, est probablement la raison pour laquelle vous avez ce produit.(votre produit peut être nul, mais si vous avez le meilleur reporting au monde, vous pouvez toujours gagner, l'inverse est vrai - votre produit peut être le meilleur en termes de fonctionnalités, mais s'il est le pire en termes de reporting, vous pouvez très facilement perdre).

ok, j'espère que certaines de ces idées vous aideront.

Autres conseils

Liquibase

liquibase.org :

  1. il comprend les définitions de mise en veille prolongée.
  2. il génère une meilleure mise à jour du schéma SQL que la mise en veille prolongée
  3. il enregistre les mises à niveau qui ont été apportées à une base de données
  4. il gère les changements en deux étapes (c.-à-d.supprimez une colonne "foo", puis renommez une autre colonne en "foo")
  5. il gère le concept de mises à niveau conditionnelles
  6. le développeur écoute réellement la communauté (avec mise en veille prolongée si vous n'êtes pas dans la foule "in" ou un débutant - vous êtes fondamentalement ignoré.)

http://www.liquibase.org

avis

la demande doit jamais gérer une mise à jour du schéma.C’est un désastre qui attend de se produire.Les données durent plus longtemps que les applications et dès que plusieurs applications tentent de travailler avec les mêmes données (l'application de production + une application de reporting par exemple), il y a de fortes chances qu'elles utilisent toutes les deux les mêmes bibliothèques d'entreprise sous-jacentes...et puis les deux programmes décident de faire leur propre mise à niveau de base de données...Amusez-vous avec que désordre.

je suis un grand fan de Porte Rouge produits qui aident à créer des packages SQL pour mettre à jour les schémas de base de données.Les scripts de base de données peuvent être ajoutés au contrôle de source pour faciliter la gestion des versions et la restauration.

En général, ma règle est la suivante :"L'application doit gérer son propre schéma."

Cela signifie que les scripts de mise à niveau du schéma font partie de tout package de mise à niveau de l'application et s'exécutent automatiquement au démarrage de l'application.En cas d'erreurs, l'application ne démarre pas et la transaction du script de mise à niveau n'est pas validée.L'inconvénient est que l'application doit avoir un accès complet aux modifications du schéma (cela gêne les administrateurs de base de données).

J'ai eu beaucoup de succès en utilisant la fonctionnalité Hibernates SchemaUpdate pour gérer les structures de tables.Laisser les scripts de mise à niveau gérer uniquement l'initialisation réelle des données et la suppression occasionnelle de colonnes (SchemaUpdate ne le fait pas).

Concernant les tests, puisque les mises à niveau font partie de l'application, les tester devient une partie du cycle de test de l'application.

Après réflexion :En tenant compte de certaines critiques formulées dans d'autres articles ici, notez que la règle dit "c'est le sien".Cela ne s'applique réellement que lorsque l'application possède le schéma comme c’est généralement le cas avec les logiciels vendus en tant que produit.Si votre logiciel partage une base de données avec d'autres logiciels, utilisez d'autres méthodes.

Ce sont tous des sujets importants, mais voici ma recommandation de mise à jour.

Vous n'avez pas spécifié votre plateforme, mais pour les environnements de build NANT que j'utilise Tarantino.Pour chaque mise à jour de base de données que vous êtes prêt à valider, vous créez un script de modification (à l'aide de RedGate ou d'un autre outil).Lorsque vous créez en production, Tarantino vérifie si le script a été exécuté sur la base de données (il ajoute une table à votre base de données pour en assurer le suivi).Dans le cas contraire, le script est exécuté.Cela nécessite tout le travail manuel (lire :erreur humaine) de la gestion des versions de base de données.

Comme Pat l'a dit, utilisez Liquibase.Surtout lorsque vous avez plusieurs développeurs avec leurs propres bases de données de développement apportant des modifications qui feront partie de la base de données de production.

S'il n'y a qu'un seul développeur, comme sur un projet sur lequel je suis actuellement (ha), je valide simplement les modifications de schéma sous forme de fichiers texte SQL dans un dépôt CVS, que je vérifie par lots sur le serveur de production lorsque les modifications de code entrent .

Mais Liquibase est mieux organisé que ça !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top