134 votes

Mécanismes de suivi des modifications du schéma de base de données

Quelles sont les meilleures méthodes pour le suivi et/ou l'automatisation DB modifications de schéma? Notre équipe utilise Subversion pour le contrôle de version et nous avons été en mesure d'automatiser certaines de nos tâches de cette façon (en poussant développe à un serveur de test, déploiement de code testé sur un serveur de production), mais nous sommes encore en train de faire de la base de données mises à jour manuellement. Je voudrais trouver ou de créer une solution qui nous permet de travailler efficacement sur des serveurs avec des environnements différents, tout en continuant à utiliser Subversion comme une interface à travers laquelle le code de base de données et mises à jour autour de différents serveurs.

De nombreux logiciels populaires forfaits comprennent l'auto-mise à jour des scripts qui détecte la version DB et appliquer les changements nécessaires. Est-ce la meilleure façon de le faire, même sur une plus grande échelle (à travers de multiples projets et parfois de multiples environnements et les langues)? Si oui, est-il un code qui simplifie le processus ou est-il préférable de simplement rouler notre propre solution? Quelqu'un a mis en place quelque chose de semblable auparavant et intégré dans la Subversion post-commit des crochets, ou est-ce une mauvaise idée?

Alors qu'une solution qui prend en charge de multiples plates-formes serait préférable, nous avons absolument besoin de l'appui de la Linux/Apache/MySQL/PHP pile comme la majorité de notre travail est sur cette plate-forme.

56voto

Joey deVilla Points 4487

Dans les Rails, il y a la notion de migrations, les scripts dans lequel les modifications apportées à la base de données sont prises en Ruby, plutôt que d'une base de données spécifique à la saveur de SQL. Votre Ruby code des migrations finit par être convertie en DDL spécifiques à votre base de données actuelle; ce qui rend la commutation de la base de données des plates-formes très facile.

Pour chaque modification que vous apportez à la base de données, vous écrivez une nouvelle migration. Les Migrations ont généralement deux méthodes: un "up" de la méthode dans laquelle les modifications sont appliquées et un "bas" de la méthode dans laquelle les modifications sont annulées. Une seule commande affiche la base de données à jour, et peut également être utilisé pour mettre la base de données à une version spécifique du schéma. Dans les Rails, les migrations sont conservés dans leur propre répertoire dans le répertoire du projet et obtenir vérifié dans le contrôle de version comme tout autre projet de code.

Cet Oracle guide Rails migrations couvre les migrations assez bien.

Les développeurs qui utilisent d'autres langues ont regardé les migrations et les ont mis en œuvre leurs propres versions linguistiques spécifiques. Je sais de Ruckusing, PHP migrations de système qui s'inspire de Rails pour les migrations; il pourrait être ce que vous cherchez.

50voto

rix0rrr Points 4924

Nous utilisons quelque chose de semblable à bcwoord pour garder nos schémas de base de données synchronisées à travers 5 différents types d'installations (production, mise en scène et un peu de développement des installations), et sauvegardés dans le contrôle de version, et ça marche plutôt bien. Je vais développer un peu:


Pour synchroniser la structure des bases de données, nous avons un seul script, update.php et un certain nombre de fichiers numérotés de 1.sql, 2.sql, 3.sql, etc. Le script utilise une table supplémentaire pour stocker le numéro de la version actuelle de la base de données. Le N. sql fichiers sont fabriqués à la main, pour aller à partir de la version (N-1) pour la version N de la base de données.

Ils peuvent être utilisés pour ajouter des tables, ajouter des colonnes, migrer des données à partir d'un ancien à un nouveau format de colonne puis déposez la colonne, insérer "maître" lignes de données tels que les types d'utilisateur, etc. Fondamentalement, il peut tout faire, et avec une bonne migration de données de scripts que vous ne serez jamais perdre de données.

Le script de mise à jour fonctionne comme ceci:

  • Se connecter à la base de données.
  • Faire une sauvegarde de la base de données actuelle (parce que les choses vont aller de mal) [mysqldump].
  • Créer tenue de la comptabilité de table (appelée _meta) si elle n'existe pas.
  • Lire la VERSION actuelle de _meta table. Supposons 0 si non trouvé.
  • Pour tous les .sql fichiers numérotés de plus que la VERSION, de les exécuter dans l'ordre
  • Si l'un des fichiers a produit une erreur: restaurer la sauvegarde
  • Sinon, mise à jour de la version dans la tenue de livres de table à la plus élevée .fichier sql exécutée.

Tout se passe dans le contrôle de source, et chaque installation a un script pour mettre à jour vers la dernière version avec une seule exécution de script (appel update.php avec la bonne base de données de mot de passe etc.). Nous SVN update mise en scène et les environnements de production via un script qui appelle automatiquement la base de données le script de mise à jour, de sorte qu'un code de mise à jour est livré avec le nécessaire de base de données mises à jour.

On peut aussi utiliser le même script pour recréer la base de données entière à partir de zéro, nous venons de supprimer et recréer la base de données, puis exécutez le script qui va complètement à repeupler la base de données. On peut aussi utiliser le script pour remplir une base de données vide pour le test automatisé.


Il n'a fallu que quelques heures pour mettre en place ce système, c'est un concept simple et tout le monde obtient le schéma de numérotation des versions, et il a été d'une valeur inestimable dans le fait d'avoir la capacité d'aller de l'avant et de l'évolution de la conception de base de données, sans avoir à communiquer ou exécutez manuellement les modifications sur toutes les bases de données.

Attention lors du collage des requêtes à partir de phpMyAdmin! Ces requêtes générées comprennent généralement le nom de base de données, vous ne voulez certainement pas, car il va briser vos scripts! Quelque chose comme CREATE TABLE mydb.newtable(...) échouera si la base de données sur le système n'est pas appelé mydb. Nous avons créé un pré-commentaire SVN crochet qui va interdire .les fichiers sql contenant de l' mydb chaîne de caractères, qui est un signe certain que quelqu'un copie/collé à partir de phpMyAdmin sans vérification appropriée.

12voto

bcwood Points 3599

Mon équipe écrit tous les changements de base de données et valide ces scripts avec SVN, avec chaque version de l'application. Cela permet des modifications incrémentielles de la base de données, sans perte de données.

Pour passer d'une version à l'autre, il vous suffit d'exécuter l'ensemble des scripts de modification, et votre base de données est à jour, et vous disposez toujours de toutes vos données. Ce n'est peut-être pas la méthode la plus facile, mais c'est définitivement efficace.

10voto

Si vous êtes toujours à la recherche de solutions : nous proposons un outil appelé neXtep designer. C'est un environnement de développement de base de données avec laquelle vous pouvez mettre l'ensemble de votre base de données sous contrôle de version. Vous travaillez sur une version dépôt contrôlé où chaque changement peuvent être suivis.

Lorsque vous avez besoin de libérer une mise à jour, vous pouvez valider vos composants et le produit sera automatiquement générer le SQL script de mise à niveau de la version précédente. Bien sûr, vous pouvez générer ce SQL à partir d'une des 2 versions.

Ensuite, vous avez plusieurs options : vous pouvez prendre ces scripts et de les mettre dans votre SVN avec votre code d'application, de sorte qu'il sera déployé par votre mécanisme existant. Une autre option est d'utiliser le mécanisme de livraison de neXtep : les scripts sont exportés dans quelque chose appelé un "colis" (scripts SQL + descripteurs XML), et d'un programme d'installation peut comprendre ce paquet et de le déployer sur un serveur cible, tout en assurant strcutural de la cohérence, de la vérification des dépendances, de l'enregistrement de la version installée, etc.

Le produit est GPL et est basé sur Eclipse pour qu'il fonctionne sur Linux, Mac et windows. Il a également le soutien d'Oracle, Mysql et Postgresql pour le moment (DB2 support est sur le chemin). Avoir un oeil sur le wiki où vous trouverez de plus amples informations : http://www.nextep-softwares.com/wiki

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