Nous utilisons quelque chose de similaire à bcwoord pour garder nos schémas de base de données synchronisés sur 5 installations différentes (production, préparation et quelques installations de développement), et sauvegardés dans le contrôle de version, et cela fonctionne plutôt bien. Je vais élaborer un peu:
Pour synchroniser la structure de la base de données, nous avons un seul script, update.php, et un certain nombre de fichiers numérotés 1.sql, 2.sql, 3.sql, etc. Le script utilise une table supplémentaire pour stocker le numéro de version actuelle du base de données. Les fichiers N.sql sont fabriqués à la main, pour passer de la version (N-1) à 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 d'un ancien vers un nouveau format de colonne, puis supprimer la colonne, insérer des lignes de données «maître» telles que les types d'utilisateurs, etc. Fondamentalement, il peut tout faire et avec des données appropriées scripts de migration, vous ne perdrez jamais de données.
Le script de mise à jour fonctionne comme ceci:
- Connectez-vous à la base de données.
- Faites une sauvegarde de la base de données en cours (parce que des choses se tromper) [mysqldump].
- Créez une table de comptabilité (appelée _meta) si elle n'existe pas.
- Lire la VERSION actuelle à partir de la table _meta. Supposons 0 si non trouvé.
- Pour tous les fichiers .sql numérotés plus haut que VERSION, exécutez-les dans l'ordre
- Si l'un des fichiers a produit une erreur: revenir à la sauvegarde
- Sinon, mettez à jour la version de la table de comptabilité avec le fichier .sql le plus élevé exécuté.
Tout va 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 de update.php avec le mot de passe de base de données approprié, etc.). Nous SVN mettons à jour les environnements de préparation et de production via un script qui appelle automatiquement le script de mise à jour de la base de données, de sorte qu'une mise à jour de code est fournie avec les mises à jour de base de données nécessaires.
Nous pouvons également utiliser le même script pour recréer la base de données entière à partir de zéro; nous déposons et recréons simplement la base de données, puis exécutons le script qui repeuplera complètement la base de données. Nous pouvons également utiliser le script pour remplir une base de données vide pour des tests automatisés.
Il n'a fallu que quelques heures pour mettre en place ce système, il est conceptuellement simple et tout le monde obtient le schéma de numérotation des versions, et cela a été inestimable pour pouvoir avancer et faire évoluer la conception de la base de données, sans avoir à communiquer ou à exécuter manuellement les modifications. sur toutes les bases de données.
Attention cependant lorsque vous collez des requêtes depuis phpMyAdmin! Ces requêtes générées incluent généralement le nom de la base de données, ce que vous ne voulez certainement pas car cela cassera vos scripts! Quelque chose comme CREATE TABLE mydb
. newtable
(...) échouera si la base de données du système ne s'appelle pas mydb. Nous avons créé un hook SVN de pré-commentaire qui interdira les fichiers .sql contenant la mydb
chaîne, ce qui est un signe certain que quelqu'un a copié / collé depuis phpMyAdmin sans vérification appropriée.