Question

Quelle est la meilleure façon de sauver mon modèle de données MySQL et d'appliquer automatiquement les modifications apportées à mon serveur de base de données de développement car ils sont faits (ou au moins la nuit)?

Par exemple, aujourd'hui je travaille sur mon projet et de créer cette table dans ma base de données et enregistrer la déclaration dans le fichier SQL pour déployer plus tard à la production:

create table dog (
  uid int,
  name varchar(50)
);

Et demain, je décide que je veux enregistrer la race de chaque chien aussi. Donc, je change le fichier SQL comme suit:

create table dog (
  uid int,
  name varchar(50),
  breed varchar(30)
);

Ce script fonctionne dans la production pour la première version, mais il ne me aider mettre à jour ma base de données de développement, car ERROR 1050 (42S01): Table 'dog' already exists. De plus, il ne fonctionnera pas dans la production si ce changement a été effectué après la première version. Donc je dois vraiment ALTER la table maintenant.

Alors maintenant, j'ai deux préoccupations:

  1. Est-ce que je devrais sauver ma Modèle de données (un groupe de créer déclarations contenues dans un fichier SQL), et
  2. Comment dois-je appliquer les modifications comme ce à ma base de données?

Mon but est de libérer les changements avec précision et permettre une intégration continue. J'utilise un outil appelé DDLSYNC ne trouver et appliquer la différence dans une base de données Oracle, mais je ne suis pas sûr de ce que des outils similaires existent pour MySQL.

Était-ce utile?

La solution

Au travail, nous avons développé un petit script pour gérer notre base de données versioning. Tout changement à une table ou un ensemble de données obtient propre fichier SQL de lui.

Les fichiers sont numérotés de manière séquentielle. Nous gardons une trace des fichiers de mise à jour ont été exécutés en stockant ces informations dans la base de données. Le script insère une ligne avec le nom de fichier lorsque le fichier est sur le point d'être exécuté, et met à jour la ligne avec un horodatage d'achèvement lorsque les finitions d'exécution. Ceci est enveloppé dans une transaction. (Il est bon de rappeler que les commandes dans MySQL DDL ne peuvent pas se produire dans une transaction. Toute tentative d'effectuer une transaction dans DDL provoque une validation implicite.)

Parce que les fichiers SQL font partie de notre référentiel de code source, nous pouvons faire courir la partie du script de mise à jour du processus de déploiement normal. Cela permet de garder la base de données et le code de synchronisation simple comme bonjour. Honnêtement, le plus dur est en vous assurant une autre dev n'a pas saisi le numéro suivant dans une attente de validation.

Nous combinons ce système de mise à jour avec un (en option) essuyer tous les soirs de notre base de données de dev, remplaçant le contenu avec la sauvegarde du système en direct hier soir. Après la sauvegarde est restaurée, la mise à jour se fasse automatiquement, avec tous les fichiers de mise à jour en cours s'exécuter dans le processus.

La restauration se produit de telle sorte que seules les tables qui se trouvaient dans la base de données en direct seront écrasés. Toute mise à jour qui ajoute une table doit donc également être responsable que de l'ajouter si elle n'existe pas. DROP TABLE IF EXISTS est à portée de main. Malheureusement, tous les bases de données prennent en charge que si le système de mise à jour permet également d'exécution des scripts écrits dans notre langue de choix, non seulement SQL.

Tout cela dans environ 150 lignes de code. Il est aussi facile que la lecture d'un répertoire, en comparant le contenu à une table, et l'exécution de tout ce qui n'a pas déjà été exécuté, dans un ordre déterminé.

Autres conseils

Il existe des outils standard pour cela dans de nombreux cadres: Rails a quelque chose appelé Migrations , quelque chose qui est facile à reproduire en PHP ou toute autre langue similaire.

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