Correction sécurisée des données de la base de données de production

23

Des bugs se produisent et parfois des données doivent être corrigées en production. Quelle est la manière la plus sûre d’y parvenir du point de vue d’une grande entreprise? Existe-t-il des outils qui peuvent vous aider? Voici quelques considérations motivant cette exigence ...

  1. Nous devons enregistrer qui a exécuté la requête et ce qu'ils ont exécuté
  2. Idéalement, nous devons autoriser la personne à exécuter uniquement des requêtes sur les tables d'intérêt et uniquement pendant une courte période.
  3. Tout ce qui est en cours d'exécution, les requêtes doivent être intelligentes pour ne pas autoriser l'exécution longue et le verrouillage de SQL sans autorisation explicite.
  4. Ce processus doit être indépendant de la base de données ou au moins comprendre DB2, Oracle et SQL Server.

Nous essayons de réduire le risque que les requêtes de correction de produit ad hoc ne fassent la «mauvaise chose» et en même temps ajoutent une certaine sécurité / audtis au processus. Pensées ou idées?

Andrew White
la source
26
Ne laissez jamais la direction penser qu'il s'agit d'une procédure d'exploitation standard. Il s'agit d'une chirurgie d'urgence à cœur ouvert sans masque ni gants, PAS une façon normale de traiter les bogues qui auraient dû être détectés lors des tests.
Dan Pichelman
2
C'est parce que vous voulez travailler de cette façon que les bogues se sont produits en premier lieu.
Reactgular
7
@MathewFoscarini ce commentaire n'ajoute rien à la conversation et ne clarifie rien. Il est également faux de dire que je n'ai jamais dit que je voulais que les choses fonctionnent de cette façon, mais seulement que nous devons tenir compte de certaines considérations. Certaines des réponses ci-dessous répondent bien à tous mes points.
Andrew White
1
@AndrewWhite mes excuses Andrew aucune infraction n'était prévue.
Reactgular

Réponses:

52

Ne mettez jamais à jour les bases de données de production manuellement.

Écrire des scripts.

Vérifiez-les trois fois et demandez à plusieurs personnes de le faire, pas seulement à une seule personne qui le fait trois fois.

Incluez des requêtes de validation post-modification dans ces scripts.

Chaque fois que la situation le permet, testez l'ensemble de la modification dans une transaction qui est annulée à la fin, après l'exécution de la validation post-modification. Lorsque vous êtes sûr des résultats, modifiez la restauration en un commit.

Testez ces scripts ad nauseam contre une base de données de test.

Effectuez une sauvegarde avant d'exécuter le script sur la base de données de production.

Exécutez les scripts.

Vérifiez, validez et revérifiez les données modifiées à l'aide des scripts de validation post-modification.

Faites quand même un contrôle visuel.

Si quelque chose semble éteint, reculez et restaurez la sauvegarde.

Ne continuez pas avec les données modifiées en tant que données de production tant que vous n'êtes pas absolument sûr que tout va bien et que vous avez approuvé les responsables (commerciaux) impliqués.

Marjan Venema
la source
21
@Andrew ce n'est pas une excuse: oubliez-en une WHEREet votre base de données sera en panne pour le reste de la journée. Ou semaine.
CodeCaster
9
@AndrewWhite Vous avez demandé le moyen le plus sûr de corriger les données, pas le plus rapide . :-)
Eric King
9
@AndrewWhite - vous avez déjà un problème. Si vous précipitez le correctif, vous allez avoir DEUX problèmes, sinon plus, et / ou vous pourriez rendre les problèmes PIRES, au lieu de meilleurs.
Michael Kohne
6
@AndrewWhite - franchement, le fait que ce soit un processus non trivial me semble un plus. Tout le monde sera conscient du coût et du risque, par opposition au «bien, nous l'avons fait 23 fois auparavant sans problème».
DaveE
3
@EricKing: xkcd.com/349
Robin
20

La réponse de Marjan Venema est techniquement valable et doit être suivie dans la mesure du possible. Hélas, Marjan répond du point de vue d'un théoricien ou d'un administrateur de base de données puriste qui aime faire les choses proprement. Dans la pratique, les contraintes commerciales empêchent parfois de faire les choses de manière propre.

Imaginez le cas suivant:

  1. Il y a un bogue dans le produit logiciel qui l'empêche de fonctionner lorsqu'il détecte ce qu'il pense être une incohérence des données dans la base de données,

  2. Tous les développeurs qui pourraient potentiellement corriger le bogue dans l'application sont inaccessibles,

  3. L'entreprise perd actuellement des milliers de dollars par heure (disons 6 000 $, ce qui signifie 100 $ par minute),

  4. Le bogue affecte plusieurs tables, dont une est énorme, et ne concerne que les données elles-mêmes, pas le schéma,

  5. Afin de contourner le bogue, vous devez expérimenter un peu avec les données, ce qui implique à la fois de les supprimer et de les modifier,

  6. La base de données est volumineuse et il faudrait trois heures pour effectuer ou restaurer la sauvegarde,

  7. La dernière sauvegarde complète a été effectuée il y a trois semaines; il existe également des sauvegardes incrémentielles quotidiennes, et la dernière sauvegarde incrémentielle quotidienne a été effectuée il y a 14 heures,

  8. Les sauvegardes de bases de données sont supposées fiables; ils ont été sévèrement testés, y compris récemment,

  9. La perte de 14 heures de données n'est pas acceptable, mais la perte d'une à deux heures de données est,

  10. L'environnement de mise en scène a été utilisé pour la dernière fois il y a six mois; il semble qu'il ne soit pas à jour, et cela peut prendre des heures à le configurer,

  11. La base de données est Microsoft SQL Server 2008 Enterprise.

La façon propre de faire les choses est de:

  1. Restaurer la sauvegarde dans un environnement intermédiaire,

  2. Expérimentez là-bas,

  3. Vérifiez le script final deux fois,

  4. Exécutez le script sur le serveur de production.

La première étape coûtera 18 000 $ à votre entreprise. Le risque est assez faible si vous effectuez la troisième étape sans problème, mais comme vous travaillez sous une pression extrême, le risque serait beaucoup plus élevé. Vous pouvez vous retrouver avec un script qui a parfaitement fonctionné dans la mise en scène, puis visser la base de données de production.

Au lieu de cela, vous auriez pu faire comme ceci:

  1. Créer un instantané (Microsoft SQL Server prend en charge cela, et il faut quelques secondes pour revenir (et rien à créer) un instantané d'une base de données qui prend une heure à sauvegarder; j'imagine que d'autres produits de base de données prennent également en charge les instantanés),

  2. Expérimentez directement sur la base de données de production, en revenant à l'instantané en cas de problème.

Alors qu'un puriste réparerait la base de données d'une manière propre et aurait toujours un risque de foirer les choses compte tenu de la pression du temps tout en gaspillant plus de 20 000 $ de son entreprise, un administrateur de base de données qui prend en compte les contraintes commerciales réparera la base de données d'une manière ce qui minimisera les risques (grâce aux instantanés) tout en le faisant rapidement.

Conclusion

Je suis moi-même un puriste, et je déteste faire les choses d'une manière non propre. En tant que développeur, je refactorise le code que je modifie, je commente les parties difficiles qui n'ont pas pu être refactorisées, je teste la base de code unitaire et je fais des revues de code. Mais je prends également en considération les circonstances dans lesquelles soit vous faites les choses proprement et le lendemain, vous êtes renvoyé, soit vous minimisez à la fois les risques et l'impact financier en faisant un hack rapide qui fonctionne.

Si un gars de l'informatique veut faire les choses proprement juste pour le bien de la propreté alors que cela cause des milliers de dollars de pertes pour l'entreprise, ce gars de l'informatique a une profonde incompréhension de son travail.

Arseni Mourzenko
la source
2
Et faites votre travail en dehors des heures d'ouverture si possible - lorsque l'activité réelle des clients est au minimum
Dan Pichelman
3
Même si votre base de données est volumineuse et que la sauvegarde prend beaucoup de temps, vous pouvez probablement simplement prendre un sous-ensemble de ces données et expérimenter à ce sujet.
Radu Murzea
3
Un upvote pour votre édition, mais: si les données sont que cruciale et coûteuse pour l'entreprise, il est tout à fait idiotes que les procédures opérationnelles sont en telle forme tout à fait mauvais. Aucune sauvegarde fiable, aucun environnement minmicing l'environnement de production, nécessitant d'expérimenter avec des données en direct: je ne voudrais certainement pas travailler dans une entreprise aussi stressante et non professionnelle.
CodeCaster
3
@CodeCaster: c'est triste, mais je le vois souvent dans la pratique, y compris dans les grandes entreprises.
Arseni Mourzenko
3
Très probablement, l'entreprise est entrée dans cette situation précisément parce qu'elle n'a pas suivi les conseils du poste de Marjan quand elle en avait l'occasion.
Eric King
4

Correction sécurisée des données de la base de données de production. Quelle est la manière la plus sûre d’y parvenir du point de vue d’une grande entreprise? Existe-t-il des outils qui peuvent vous aider?

C'est une mauvaise pratique et une porte d'invitation pour plus de problèmes et de problèmes de données. Il y a même une phrase qui décrit cette approche comme « rapide et sale ».

Poursuivre les corrections / mises à jour directement sur un serveur de production est très dangereux , car cela vous coûtera une fortune à votre entreprise ( poursuites judiciaires, données incorrectes / sales, entreprises perdues, etc.) )

Cependant, des bogues seront là et devront être corrigés. La norme industrielle de facto consiste à appliquer des correctifs / (scripts de déploiement) sur un staging (environnement de pré-production avec la dernière copie de la base de données prod) et à laisser l'analyste de données / QA vérifier le correctif. Le même script doit être contrôlé par la version et appliqué à l'environnement Prod pour éviter les problèmes.

Il existe un certain nombre de bonnes pratiques mentionnées dans cet article connexe - Bonnes pratiques de la base de données de mise en scène

Un bon ensemble de références à regarder sont:

EL Yusubov
la source
2

Dans la plupart des organisations, j'ai travaillé la mise à jour des données dans l'environnement réel a toujours été effectuée par un petit groupe de personnes disposant des droits d'accès nécessaires, généralement avec un titre de poste tel que DBA. Étant donné que les mises à jour ne peuvent être effectuées que par un petit nombre de personnes, il y a au moins une chance qu'elles se familiarisent avec les données et réduisent donc (mais n'éliminent pas) le risque de problèmes.

La personne qui écrit le script de mise à jour le ferait lors du test (selon les autres réponses) et obtiendrait une approbation sérieuse de la part des non-techniciens (ceux qui connaissent le système, plus quelqu'un avec une autorité supérieure) que les fonctionnalités semblent être `` à nouveau correctes '' dans en plus de leurs propres tests paranoïaques. Les scripts et les données seraient vérifiés indépendamment par un autre technicien (souvent le rôle DBA que j'ai mentionné) lors du test avant d'être mis en production. Les résultats seraient vérifiés par rapport aux valeurs anticipées (uniques pour chaque scénario, mais souvent des choses comme les nombres de lignes, etc.)

Dans une entreprise pour laquelle je travaillais, prendre des sauvegardes n'était pas une option réaliste, mais toutes les lignes à mettre à jour étaient écrites dans un fichier texte pour référence AVANT la mise à jour, puis à nouveau APRÈS la mise à jour si quelqu'un devait y faire référence. Les scripts et ces données sont conservés dans un journal des modifications des données correctement organisé.

Chaque entreprise est unique et les risques de mise à jour de certaines données sont nettement plus importants que dans d'autres.

En ayant un processus qui oblige les gens à sauter à travers des cerceaux pour faire ces mises à jour, j'espère que vous promouvez une culture qui donne envie aux gens de traiter cela en dernier recours et de créer une attitude saine de "double vérification, triple vérification" autour de ce genre de choses.

Wayne M
la source
Oh et bien sûr, dans la mesure du possible, analysez le code dans l'application pour vous assurer que toutes les mises à jour dépendantes cachées dans la logique sont prises en compte ... Et s'il y a une chance qu'il y ait des déclencheurs sur les tables que vous mettez à jour, vérifiez-les et réfléchissez qu'ils aient besoin d'être désactivés ou non.
Wayne M
2

Il y a des moments où vous devez corriger des données sur Prod qui n'existent pas sur d'autres serveurs. Il ne s'agit pas uniquement de bogues, mais pourrait provenir d'une importation de données d'un fichier envoyé par un client qui était incorrecte ou d'un problème causé par un piratage de votre système. Ou d'un problème causé par une mauvaise saisie de données. Si votre base de données est volumineuse ou critique, vous n'aurez peut-être pas le temps de restaurer la dernière sauvegarde et de corriger le dev.

Votre première défense (et quelque chose qu'aucune base de données d'entreprise ne peut se permettre de se passer!) Sont les tables d'audit. Vous pouvez les utiliser pour annuler les modifications de données incorrectes. De plus, vous pouvez écrire des scripts pour ramener les données à l'état précédent et les tester sur d'autres serveurs bien avant de devoir rétablir les données auditées. Ensuite, le seul risque est que vous ayez identifié les enregistrements corrects à rétablir.

Ensuite, tous les scripts pour modifier les données de production doivent inclure les éléments suivants:

Ils doivent être dans des transactions explicites et avoir un bloc TRY Catch.

Ils devraient avoir un mode de test que vous pouvez utiliser pour annuler les modifications après avoir vu ce qu'elles auraient été. Vous devez avoir un état sélectionné avant la modification et une exécution après la modification pour vous assurer que la modification était correcte. Le script doit s'assurer que le nombre de lignes traitées est affiché. Nous avons une partie de cette pré-mise en place dans un modèle qui garantit que les pièces sont terminées. Les modèles de modifications permettent également de gagner du temps lors de l'écriture du correctif.

S'il y a une grande quantité de données à modifier ou à mettre à jour, pensez à écrire le script à exécuter par lots avec des validations pour chaque lot. Vous ne voulez pas verrouiller l'ensemble du système pendant que vous corrigez un million d'enregistrements. Si vous avez de grandes quantités de données à corriger, assurez-vous qu'un administrateur de base de données ou quelqu'un qui est habitué à l'optimisation des performances examine le script avant de l'exécuter et de l'exécuter pendant les heures de repos, si possible.

Ensuite, tous les scripts pour changer quoi que ce soit en production sont examinés et mis en contrôle de code source. Tous - sans exception.

Enfin, les développeurs ne doivent pas exécuter ces scripts. Ils doivent être exécutés par dbas ou un groupe de gestion de configuration. Si vous n'avez ni l'un ni l'autre, alors seules les personnes qui sont des prospects technologiques ou supérieurs devraient avoir le droit d'exécuter des choses sur prod. Moins il y a de personnes qui exécutent des choses sur prod, plus il est facile de détecter un problème. Les scripts doivent être écrits de manière à être simplement exécutés, sans surligner les parties et à exécuter une étape à la fois. Ce sont les éléments de mise en évidence qui mettent souvent les gens en difficulté lorsqu'ils oublient de mettre en évidence la clause where.

HLGEM
la source
0

J'ai mis à jour des données plusieurs fois lors de l'exécution de bases de données de production. Je suis d'accord avec la réponse ci-dessus, que ce ne serait jamais une procédure d'exploitation standard.

Cela coûterait aussi cher (nous regarderions par-dessus les épaules et discuterions peut-être de 2 ou 3)

Et la règle d'or: faites toujours une instruction select pour montrer ce qui serait fait avant de faire une instruction update / delete / insert

La règle d'or est appliquée par les deux autres personnes de l'équipe!

user99432
la source
0

re: Réponse de MainMa ...

Il y a un bogue dans le produit logiciel qui l'empêche de fonctionner lorsqu'il détecte ce qu'il pense être une incohérence des données dans la base de données,

  • Comment savez-vous que c'est un "bug"? Les données sont incohérentes selon les règles définies par le développeur du logiciel.

Tous les développeurs qui pourraient potentiellement corriger le bogue dans l'application sont inaccessibles,

L'entreprise perd actuellement des milliers de dollars par heure (disons 6 000 $, ce qui signifie 100 $ par minute),

  • Apparemment, une perte de 100 $ / minute n'est pas suffisamment importante pour la direction de l'entreprise pour qu'elle puisse localiser et s'assurer que les développeurs compétents reviennent pour corriger leur erreur et vous aider à restaurer la base de données.

Le bogue affecte plusieurs tables, dont une est énorme, et ne concerne que les données elles-mêmes, pas le schéma,

  • Tous les problèmes de base de données "concernent" le schéma. La façon dont le schéma est conçu est ce qui va déterminer comment vous résolvez ce problème.

Afin de contourner le bogue, vous devez expérimenter un peu avec les données, ce qui implique à la fois de les supprimer et de les modifier,

  • C'est à cela que sert votre base de données intermédiaire. Vous devrez peut-être le repeupler avec des données «corrompues» de la base de données de production juste après avoir effectué une sauvegarde complète de la production en ligne.

La base de données est volumineuse et il faudrait trois heures pour effectuer ou restaurer la sauvegarde,

  • Ensuite, vous feriez mieux de commencer immédiatement afin qu'il puisse s'exécuter pendant que vous analysez le problème, développez vos scripts de correction, testez-les et affinez-les avec les développeurs et les autres DBA qui vous aident.

La dernière sauvegarde complète a été effectuée il y a trois semaines; il existe également des sauvegardes incrémentielles quotidiennes, et la dernière sauvegarde incrémentielle quotidienne a été effectuée il y a 14 heures,

  • Vous n'avez pas au moins de sauvegardes complètes en ligne quotidiennes? T'es foutu. Mais vous y êtes probablement habitué. Heureusement que la sauvegarde complète que vous avez commencée ci-dessus est en cours d'exécution. Assurez-vous que la direction traite chaque minute des coûts qui auraient pu être évités avec des sauvegardes quotidiennes en ligne.

Les sauvegardes de bases de données sont supposées fiables; ils ont été sévèrement testés, y compris récemment,

  • Excellent! Il se peut alors que vous n'ayez pas à restaurer la base de données plus d'une fois.

La perte de 14 heures de données n'est pas acceptable, mais la perte d'une à deux heures de données est,

  • Dans le scénario que vous avez décrit, tous les paris sont désactivés. Il s'agit d'une situation de "gestion des catastrophes informatiques". Une bonne chose à faire pour la direction tout au long de cette tâche est de documenter les coûts qui pourraient être évités à l'avenir avec des sauvegardes et des procédures et des ressources de récupération appropriées.

L'environnement de mise en scène a été utilisé pour la dernière fois il y a six mois; il semble qu'il ne soit pas à jour, et cela peut prendre des heures à le configurer,

  • Si votre système de sauvegarde prend en charge les sauvegardes en ligne (c'est-à-dire la base de données entièrement opérationnelle pendant la sauvegarde), vous pouvez effectuer l'extrait pour repeupler la base de données intermédiaire en même temps si vous disposez de ressources matérielles suffisantes pour éviter de ralentir la sauvegarde.

La base de données est Microsoft SQL Server 2008 Enterprise.

  • Plus difficile à faire, mais pas impossible. Bonne chance!
DocSalvager
la source