2008-08-27 8 views
10

Avoir à mettre à niveau un schéma de base de données rend l'installation d'une nouvelle version de logiciel beaucoup plus compliquée. Quelles sont les meilleures pratiques pour ce faire?Liste de contrôle pour les mises à niveau de schéma de base de données

Je suis à la recherche d'une liste de contrôle ou la chronologie des éléments d'action, tels que

  • 8:30 fermé vers le bas des applications
  • 08h45 modifier les schémas
  • 09h15 installer de nouvelles applications
  • 9:30 redémarrer db

etc, montrant comment minimiser le risque et les temps d'arrêt. Des questions telles que

  • sauvegarde de la mise à niveau si les choses tournent mal
  • minimisant l'impact pour les applications existantes
  • met à jour « chaud » alors que la base de données est en cours d'exécution
  • promotion de dev pour tester les serveurs de production

sont particulièrement intéressants.

Répondre

5

J'ai beaucoup d'expérience avec cela. Mon application est hautement itérative et les changements de schéma se produisent fréquemment. Je fais une production environ toutes les 2 à 3 semaines, avec 50 à 100 éléments supprimés de ma liste FogBugz pour chacun d'entre eux. Toutes les versions que nous avons réalisées au cours des dernières années ont nécessité des modifications de schéma pour prendre en charge de nouvelles fonctionnalités.

La clé pour cela est de pratiquer les changements plusieurs fois dans un environnement de test avant de les faire réellement sur les serveurs live.

Je conserve un fichier de liste de contrôle de déploiement qui est copié à partir d'un modèle, puis fortement édité pour chaque version avec tout ce qui sort de l'ordinaire.

J'ai deux scripts que je cours sur la base de données, un pour les changements de schéma, un pour la programmabilité (procédures, vues, etc). Le script des changements est codé à la main, et celui avec les procs est scripté via Powershell. Le script de modification est exécuté lorsque tout est désactivé (vous devez choisir une heure qui dérange le moins d'utilisateurs pour cela), et il est exécuté commande par commande, manuellement, au cas où quelque chose deviendrait bizarre. Le problème le plus courant que j'ai rencontré est l'ajout d'une contrainte unique qui échoue en raison de lignes en double. Lorsque je me prépare à un cycle de tests d'intégration, je passe en revue ma liste de contrôle sur un serveur de test, comme si ce serveur était en production. Puis, en plus de cela, je vais obtenir une copie réelle de la base de données de production (c'est le bon moment pour échanger vos sauvegardes hors site), et je lance les scripts sur une version locale restaurée (ce qui est bien aussi la dernière sauvegarde est sonore). Je suis en train de tuer beaucoup d'oiseaux avec une pierre ici.

Voilà 4 bases de données au total:

  1. Dev: toutes les modifications doivent être apportées dans le script de changement, jamais avec le studio.
  2. Test: Les tests d'intégration se passe ici
  3. Copie de la production: déploiement Dernière minute pratique
  4. production

Vous avez vraiment, vraiment besoin de faire les choses quand vous le faites sur la production. La suppression des modifications de schéma est difficile.

En ce qui concerne les correctifs, je ne corrige que des procédures, jamais de schéma, à moins que ce soit un changement très isolé et crucial pour l'entreprise.

1

C'est un sujet dont je viens de parler au travail. Principalement, le problème est que, à moins que les migrations de base de données ne soient gérées correctement par votre framework, par exemple les rails et leurs scripts de migration, c'est à vous de décider.

La façon dont nous le faisons actuellement a des défauts apparents, et je suis ouvert à d'autres suggestions.

  1. Avoir un vidage de schéma avec des données statiques qui doivent être maintenues à jour et dans le contrôle de version.
  2. Chaque fois que vous effectuez une action de modification de schéma, ALTER, CREATE, etc. le transfère dans un fichier et le lance dans le contrôle de version.
  3. Assurez-vous de mettre à jour le vidage sq db d'origine. Lorsque vous faites des push to live, assurez-vous que vous ou votre script appliquez les fichiers sql à la base de données.
  4. Nettoyez les anciens fichiers SQL qui sont dans le contrôle de version à mesure qu'ils vieillissent.

Ceci n'est en aucun cas optimal et n'est vraiment pas conçu comme un "backup" db. C'est simplement pour faire des poussées pour vivre facile, et pour garder les développeurs sur la même page. Il y a probablement quelque chose de cool que vous pourriez installer avec capistrano jusqu'à automatiser l'application des fichiers sql à la base de données.

Le contrôle de version spécifique de Db serait vraiment génial. Il y a probablement quelque chose qui fait cela et s'il n'y en a pas, il devrait probablement l'être.

1

Deux notes rapides:

  1. il va sans dire ... Je vais le dire deux fois.
    Vérifiez que vous avez une sauvegarde valide.
    Vérifiez que vous avez une sauvegarde valide.

  2. @mk. Vérifiez Jeff's blog post sur le contrôle de version de base de données (si vous ne l'avez pas déjà)

Questions connexes