Bonjour à tous,
Je viens poster dans cette section car je n'ai pas vraiment trouvé d'autres qui correspondent à ma problématique mais si c'est le cas, n'hésitez pas à me le signaler !
Alors je commence par ma problématique générale :
J'ai une base de données qui contient un assez grand nombre d'information. Son schéma évolue assez violemment de manière régulière, ce qui rend les mises à jour longues, complexes et critiques.
A chaque mise à jour, il y a des erreurs durant la procédure car il y a des préconditions non remplies, des fichiers de configuration mal renseigné, etc. Le support niveau 3 (développeurs) sont alors les seuls aptes à trouver le problème (acceptable) et à "cuisiner" une reprise de la mise à jour (trop contraignant pour mon client).
Le fonctionnement actuel :
La base de données est une Oracle 10g R2 sous Linux. L'installation et la mise à jour de la base de données s'effectue via des scripts KSH qui exécute des scripts SQL via le client en ligne de commande (SQL*Plus). Un seul script SQL principal est exécuté qui ensuite rappel d'autres scripts. Par défaut, l'option permettant d'ignorer les erreurs est activée, de sorte qu'en cas d'erreur, l'erreur est inscrite sur les sorties standard et le déroulement du script se poursuit.
En général en cas d'erreur, la personne au commande corrige rapidement le problème et relance entièrement le script. Le soucis étant qu'une erreur ignorée peut avoir compromis définitivement la BDD (données perdues), ou avoir mis la base de données dans un état complètement instable et nécessite de nombreuses opérations manuelles pour terminer la mise à jour.
Solution générale
D'un point de vue générale, nous avons opté pour le principe suivant : "découper" les scripts SQL en étapes. Les étapes sont jouées les unes après les autres s'il n'y a pas d'erreur "détectée". A la fin de chaque étape, on "trace" la bonne exécution du script afin de ne pas le rejouer en cas de reprise.
Il me reste donc à trouver comment découper les étapes (exécution conditionnelle), détecter les erreurs et tracer la bonne exécution.
Solution détaillée
Nous avons imaginé la solution suivante :
- Création d'une table de "synoptique" qui contiendrait la liste des étapes et leur état.
- Création d'un référentiel d'update. Celui contiendrait un script par étape et éventuellement des sous-répertoires.
- Création d'un script qui construirait le "synoptique" (insertion dans la table correspondante) en se basant sur les scripts contenus à la racine du référentiel, en triant par ordre alphabétique.
- Création d'un script qui générait un script SQL principal selon les états des étapes du "synoptique". Après l'exécution de chaque étape, le script principal met à jour la table de "synoptique". Toute erreur arrête le script.
- Chaque script d'étape se découpe deux parties : actions et contrôles. Les erreurs des actions sont ignorées et les contrôles consistent pour la plupart à vérifier dans le dictionnaire l'état des objets (tables, vues, etc.). L'échec d'un contrôle génère une erreur qui est renvoyée au script appelant.
Questions
Je pense que cette problématique n'est pas nouvelle et je voudrais votre avis sur les choix que nous avons effectués ?
Avez-vous optés pour d'autres solutions ? Que ce soit dans le principe générale ou dans son implémentation ?
Partager