Comment gérez-vous les déploiements de modifications de base de données?

13

Nous avons discuté des techniques de déploiement de base de données aujourd'hui, après avoir connu quelques échecs récents dans notre processus actuel et vu des situations où nous aimerions annuler un déploiement, mais l'ancienne version de l'application n'avait jamais été testée par rapport à la nouvelle version de la base de données.

D'une part, il existe des déploiements de style migration, où vous avez une instruction de version vers le haut et une instruction de version vers le bas (que celles-ci soient écrites en SQL ou dans le langage de votre application) et votre application sait à quelle version elle doit accéder.

Ce sont simples, et comme nous ne reviendrons pas souvent, les développeurs aiment le simple. Cependant, il existe des risques lorsque vous ajoutez un champ / table et que ce champ est rempli avant de revenir en arrière. Ou pire, où vous déposez des données pertinentes pour la version précédente.

D'un autre côté, nous pouvons envisager une approche de mise à niveau, de restauration et de restauration où la restauration n'est pas aussi drastique qu'avec les migrations. Par exemple, la mise à niveau peut ajouter un champ non nullable; la restauration la rend nulle pour que l'ancienne application s'en fiche; rollforward remplit les champs nuls et les rend à nouveau non nullables.

Cela conserve les données mais est compliqué à coder et à tester (malheureusement, nos tests d'intégration automatisés sont pratiquement inexistants et pendant que nous corrigeons cela, nous avons un problème entre-temps).

Existe-t-il des moyens sûrs d'atténuer les problèmes avec ces derniers? Y a-t-il d'autres options que je devrais envisager? Avez-vous eu de mauvaises expériences que vous aimeriez partager et qui pourraient me faire souffrir plus tard?

pdr
la source

Réponses:

9

Les modifications de la base de données doivent être traitées comme toutes les autres modifications et déployées en tant que scripts dans le cadre du déploiement (et bien sûr enregistrées dans le contrôle de code source). Puisqu'ils sont déployés avec le code de la même version d'application, vous savez exactement ce qui doit être annulé. Vous pouvez avoir de la fantaisie et écrire un script pour annuler chaque modification au moment où vous écrivez le script de base de données, mais si les restaurations ne sont pas courantes, vous ne voudrez peut-être pas le faire. Si une nouvelle colonne est remplie, vous perdrez des données si vous revenez à la base de données d'origine.

Dans SQL Server, vous pouvez prendre un instantané juste avant un déploiement, puis y revenir immédiatement si le déploiement échoue. Cela suppose que le déploiement ne se produit PAS lorsque les utilisateurs sont sur le système (vous ne voulez pas perdre leurs modifications de données). Cela est particulièrement utile lors d'une version majeure lorsque vous devrez peut-être supprimer l'intégralité du système pour effectuer la mise à niveau. Ou vous pouvez toujours prendre l'instantané et faire une comparaison de base de données entre l'instantané et la base de données pour voir les différences si vous devez annuler. Un outil comme SQLCompare peut même générer le code pour revenir à la structure de l'instantané. Je ne sais pas ce qui est disponible pour les autres bases de données.

HLGEM
la source
3

Les modifications apportées à une structure de base de données doivent être automatisées / scriptées et testées à l'aide d'un environnement de test. Les modifications manuelles sont trop risquées dans un environnement de production

La seule stratégie de restauration raisonnable (celle qui a le moins de chances d'aggraver les choses) consiste à revenir à un instantané avant la mise à niveau. Si les choses vont mal, cela se produira soit assez rapidement pour permettre de revenir à l'instantané, soit trop tard pour un retour en arrière (le prochain rapport de fin de semaine échoue en raison de problèmes dans la base de données).

Les modifications peuvent être effectuées de manière incrémentielle (comme l'ajout d'un champ) et ainsi testées en direct avec moins de risques que lorsque vous les faites toutes en une seule passe.

Avec la planification, vous pouvez apporter des modifications à la base de données pour prendre en charge plusieurs versions à venir, au lieu d'avoir à confronter la mise à niveau du logiciel et de la base de données à chaque version.

Soyez prêt à être en mode d'urgence les jours suivant une mise à niveau de la base de données, comme vous le feriez s'il s'agissait d'une mise à niveau logicielle.

Résistez à l'envie de corriger manuellement les problèmes. Utilisez votre stratégie de contingence (restauration, instantané) et réfléchissez aux raisons pour lesquelles les choses ont mal tourné avant de réessayer la mise à niveau.

Apalala
la source