33 votes

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

Cela semble être un domaine négligé qui pourrait vraiment utiliser un aperçu. Quelles sont vos meilleures pratiques pour:

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

etc...

9voto

Pat Points 2480

liquibase.org:

  1. il comprend hibernate définitions.
  2. il génère une meilleure mise à jour du schéma sql que hibernate
  3. il enregistre les mises à niveau ont été apportées à une base de données
  4. il gère deux-étape des changements (c'est à dire supprimer une colonne "foo" et puis renommer une colonne différente de "foo")
  5. il gère le concept de la réserve de mises à niveau
  6. le développeur réellement à l'écoute de la communauté (avec mise en veille prolongée si vous n'êtes pas dans le "in" de la foule ou un débutant -- vous êtes fondamentalement ignoré.)

http://www.liquibase.org

6voto

Pat Points 2480

opinion

l'application ne doit jamais gérer une mise à jour de schéma. C'est un désastre imminent. 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 création de rapports, par exemple), il est probable qu'elles utiliseront les mêmes bibliothèques d'entreprise sous-jacentes ... et que les deux programmes décident alors de le faire. faire leur propre mise à niveau de base de données ... amusez-vous avec ce gâchis.

4voto

Sindri Traustason Points 1688

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

Cela signifie schéma scripts de mise à niveau font partie d'un package de mise à niveau de l'application et de lancer automatiquement au démarrage de l'application. Dans le cas d'erreurs de l'application ne démarre pas et le script de mise à niveau de la transaction n'est pas validée. L'inconvénient de cette est que l'application a avoir pleins de modification de l'accès au schéma (ce qui agace Administrateurs de bases de données).

J'ai eu beaucoup de succès à l'aide de Hiberne SchemaUpdate fonctionnalité pour gérer les structures de la table. Laissant les scripts de mise à niveau pour seulement gérer les données réelles de l'initialisation et occasionnel de la suppression de colonnes (SchemaUpdate ne pas le faire).

Concernant les tests, depuis les mises à jour font partie de l'application, des tests de dépistage devient une partie du cycle d'essai de l'application.

Après coup: Prise en compte de certains de la critique dans d'autres posts ici, la note de la règle dit: "c'est propre". Il ne s'applique vraiment où l'application possède le schéma comme c'est généralement le cas avec les logiciels vendus comme un produit. Si votre logiciel est le partage d'une base de données avec d'autres logiciels, l'utilisation d'autres méthodes.

4voto

John Hunter Points 2204

Je suis un grand fan des produits Red Gate 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 des restaurations.

3voto

nso1 Points 355

C'est une excellente question. ( Il y a une forte chance que cela va finir normalisé contre denormalised base de données débat..que je ne vais pas commencer... maintenant ça va, pour une entrée.)

certains sur le dessus de ma tête des choses que j'ai fait (va ajouter plus de quand j'ai un peu plus de temps ou besoin d'une pause)

la conception du client - c'est là que le VB méthode en ligne de sql (même avec des déclarations préparées à l'avance) vous permet de vous causer des ennuis. Vous pouvez passer des plombes juste de trouver ces déclarations. Si vous utilisez quelque chose comme Hibernate et de mettre autant de SQL dans les requêtes nommées vous disposez d'un lieu unique pour la plupart des sql (rien de pire que d'essayer de tester sql qui est à l'intérieur de certains SI la déclaration et que vous ne frappez pas le "déclencheur" critères de votre test pour que, SI la déclaration). Avant l'utilisation d'hibernate (ou d'autres orm') quand je veux faire le SQL directement dans JDBC ou ODBC je mettrais toutes les instructions sql comme publiques les champs d'un objet (avec une convention de nommage) ou dans un fichier de propriétés (également avec une convention de nommage pour les valeurs dites PREP_STMT_xxxx. Et d'utiliser soit la réflexion ou l'itération sur les valeurs au démarrage en a) cas de test b) démarrage de l'application (certains sgbdr vous permettent de pré-compiler avec les requêtes préparées avant l'exécution, donc au démarrage post de connexion je pré-compiler le prep-stmts au démarrage de l'application d'auto-test. Même pour 100 de déclarations sur une bonne sgbdr c'est seulement quelques secondes. et une seule fois. Et il a sauvé mes fesses beaucoup. Sur un projet de l'administrateur de ne pas communiquer d'une autre équipe, dans un autre pays) et le schéma semblait changer tous les SOIRS, pour aucune raison. Et chaque matin, nous avons eu une liste de exactement où il a cassé l'application au démarrage.

Si vous avez besoin d'adhoc de la fonctionnalité , de la mettre dans une classe nommée (ie. encore une fois une convention de nommage aide avec automatisée de tests) qui agit comme une sorte d'usine pour vous de requête (ie. il génère la requête). Vous allez avoir à écrire le code équivalent de toute façon, il suffit de le mettre dans un endroit où vous pouvez le tester. Vous pouvez même écrire des méthodes de test sur le même objet ou à une classe distincte.

Si vous le pouvez , essayez également d'utiliser des procédures stockées. Ils sont un peu plus difficile à tester comme ci-dessus. Certains db est aussi de ne pas pré-valider le sql stockées procs contre le schéma au moment de la compilation seulement au moment de l'exécution. Il s'agit habituellement de dire de prendre une copie du schéma de structure (pas de données) et, ensuite, la création de tous les procs contre cette copie (dans le cas de la db de l'équipe de faire les changements que vous N'avez pas validé correctement). Ainsi, la structure peut être vérifiée. mais comme un point de la gestion du changement stockées procs sont grands. Sur le changement de tous les obtenir. Surtout lorsque la db changements sont le résultat de changements aux processus opérationnels. Et tous les langages (java, vb, etc obtenir le changement )

J'ai l'habitude aussi de l'installation d'une table que j'utilise appelé system_setting etc. Dans ce tableau, nous gardons un identificateur de VERSION. C'est ainsi que les bibliothèques clientes pouvez de connexion et de valider s'ils sont valides pour cette version du schéma. Selon les modifications apportées à votre schéma, vous ne souhaitez pas autoriser la connexion des clients si ils peuvent corrompre votre schéma (ie. vous n'avez pas beaucoup de référentiel de règles dans la base de données, mais sur le client). Cela dépend si vous allez également avoir plusieurs versions de client (ce qui est le cas dans le NON - web apps, c'est à dire. ils sont en cours d'exécution dans le mauvais binaire). Vous pourriez également avoir le lot d'outils, etc. Une autre approche que j'ai fait est de définir un ensemble de schémas de fonctionnement des versions dans une sorte de fichier de propriété ou encore dans un system_info table. Ce tableau est chargé sur connexion, puis utilisé par chaque "manager" (d'habitude, j'ai une sorte de côté client api pour effectuer la plupart des db stuff) pour valider pour que l'opération si c'est la bonne version. Ainsi, la plupart des opérations peuvent réussir, mais vous pouvez aussi ne pas (lancer une exception) sur les méthodes de date et vous dit POURQUOI.

gérer le changement de schéma -> mise à jour de la table ou ajouter 1-1 relations de nouvelles tables ? J'ai vu beaucoup de magasins qui ont toujours accès à des données via un point de vue pour cette raison. Cela permet de noms de table pour changer , colonnes etc. J'ai joué avec l'idée de traiter des vues comme des interfaces COM. c'est à dire. vous ajoutez un nouveau point de VUE pour les nouvelles fonctionnalités et versions. Souvent, ce que vous avez ici est que vous pouvez avoir beaucoup de rapports (en particulier de l'utilisateur final des rapports personnalisés) qui assument les formats de tableau. Les points de vue vous permettent de déployer un nouveau format de tableau mais le support client existant apps (rappelez-vous tous ces satanés adhoc rapports).

Aussi, besoin d'écrire de mise à jour et restauration de scripts. et de nouveau TESTER, TESTER, TESTER...

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

En fait avait un grand projet commercial (ie. logiciel de magasin) où nous avons eu le même problème. L'architecture est une de niveau 2 et ils ont été à l'aide d'un produit un peu comme PHP, mais pré-php. Même chose. autre nom. de toute façon, je suis venu dans la version 2....

Il coûtait BEAUCOUP D'ARGENT pour faire les mises à jour. Beaucoup. c'est à dire. donnez semaines de consultation libre du temps sur le site.

Et il a été de passer au point de vouloir ajouter de nouvelles fonctionnalités ou d'optimiser le code. Une partie du code utilisé des procédures stockées , donc on avait des points communs, où nous avons pu gérer du code. mais d'autres secteurs ont été cette embedded sql balise html. Ce qui était idéal pour obtenir rapidement sur le marché, mais à chaque interaction de nouvelles fonctionnalités, le coût d'au moins doublé le test et la maintenance. Ainsi, lorsque nous étions à la recherche à sortir le php type de code, la mise en couches de données (ce qui était 2001-2002, avant tout ORM, etc...) et l'ajout d'un lot de nouvelles fonctionnalités (de feedback de la clientèle) s'est penchée sur ce problème de la façon d'ingénieur des AMÉLIORATIONS dans le système. Ce qui est une grosse affaire, que les mises à niveau coûter beaucoup d'argent pour le faire correctement. Maintenant, la plupart des modèles et toutes les autres choses que les gens discuter avec un degré d'énergie concerne OO code qui est exécuté, mais que penser du fait que vos données a) intégrer cette logique, b) le sens et aussi la structure de données peut changer au fil du temps, et souvent en raison de la façon dont les données fonctionne, vous vous retrouvez avec beaucoup de sous-processus / applications de vos clients organisation qui a besoin de données -> reporting ad hoc ou de tout complexe de rapports personnalisés, ainsi que les travaux en lots qui ont été fait pour coutume de flux de données etc.

Avec cela à l'esprit, j'ai commencé à jouer avec quelque chose d'un peu gauche du champ. Il a aussi quelques hypothèses. a) les données sont fortement de lire plus que d'écrire. b) les mises à jour ne se produisent, mais pas à la banque niveaux ie. une ou 2 seconde le dire.

L'idée était d'appliquer une COM / vue de l'Interface de données accessibles par les clients au cours d'une série de tables (qui varie avec les changements de schéma). Vous pouvez créer une autre vue pour chaque type d'opération de mise à jour, de suppression, d'insertion et de lire. Ce qui est important. La vue de la carte directement à une table , ou vous permettent de déclencher une table factice qui ne le réel, mises à jour ou des inserts ... Ce que je voulais, c'était une sorte de récupérable niveau d'indirection qui pourrait encore être utilisée par crystal reports, etc. REMARQUE - Pour les plaquettes , mise à jour et supprime vous pouvez également utiliser des témoins de procs. Et vous avez eu une version pour chaque version du produit. De cette façon, votre version 1.0 a sa version du schéma, et si les tables changé, vous auriez encore la version 1.0 de points de VUE, mais avec un NOUVEAU backend logique à la carte pour les nouvelles tables nécessaires, mais vous avez aussi eu la version 2.0 points de vue qui serait en charge de nouveaux champs, etc. C'était vraiment juste pour soutenir la création de rapports ad hoc, qui, si vos AFFAIRES et n'est pas un codeur est probablement le point de l'ensemble de pourquoi vous avez le produit. (votre produit peut être de la merde mais si vous avez le meilleur reportage dans le monde, vous pouvez encore gagner, l'inverse est vrai - votre produit peut-être la meilleure caractéristique sage, mais si sa le pire sur les rapports que vous pouvez très facilement perdre).

bon, j'espère que certains de ces idées vous aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X