Les meilleures pratiques pour les modifications de schéma et les migrations de données vers une base de données dynamique sans temps d'arrêt?

43

Comment effectuez-vous des modifications de schéma dans une base de données dynamique sans temps d'arrêt?

Par exemple, disons que j'ai une base de données PostgreSQL avec une table contenant diverses données utilisateur telles que des adresses électroniques, etc., toutes associées à des utilisateurs spécifiques. Si je souhaitais déplacer les adresses électroniques vers une nouvelle table dédiée, je devais modifier le schéma, puis migrer les données de messagerie vers la nouvelle table. Comment cela pourrait-il être fait sans arrêter les écritures sur la table d'origine? Certes, pendant que les données de l'ancienne table étaient écrites sur la nouvelle, de nouvelles données continueraient à être écrites sur l'ancienne table et seraient manquées, n'est-ce pas?

Je suppose que ce problème se pose assez souvent mais je ne trouve aucune solution standard pour le résoudre.

Cet article traite du problème, mais je ne comprenais pas vraiment l'étape 3. Il dit d'écrire dans les deux tables, puis de migrer les anciennes données de la première table vers la nouvelle. Comment vous assurez-vous de ne migrer que d'anciennes données?

(J'utilise PostgreSQL sur Heroku .)

Dan Leary
la source
2
Facebook a développé un outil pour faire cela pour MySQL.
Nick Chammas
2
K. Scott Allen a écrit sur un système de gestion des versions de schéma ici . J'ai créé DbUpdater, un outil open source pour le déploiement de schéma prenant en charge les versions. Plus ici - http://www.tewari.info/dbupdater
cendres le
@ NickChammas Merci de partager cela. J'ai beaucoup de questions à ce sujet. Pourriez-vous s'il vous plaît suggérer un tutoriel plus détaillé, une vidéo de préférence, qui explique des choses comme le journal des bits, les index non clusterisés et répond à des questions telles que: table directement. 2. Quand la phase de copie se terminera-t-elle? Ce ne sont que quelques-unes de mes questions et je n’ai que commencé à le lire.
Sandeepan Nath
@SandeepanNath - Désolé, je ne connais pas très bien l'outil de Facebook et je ne peux donc pas vous orienter vers plus de ressources. J'ai lu une annonce à ce sujet et posté mon commentaire il y a des années, mais je ne l'ai jamais utilisé.
Nick Chammas

Réponses:

27

Vous avez presque déjà votre réponse:

  1. Créer la nouvelle structure en parallèle
  2. Commencez à écrire aux deux structures
  3. Migrer les anciennes données vers la nouvelle structure
  4. Seulement écrire et lire la nouvelle structure
  5. Supprimer les anciennes colonnes

En ce qui concerne l' étape 3 , utilisez quelque chose comme ceci (dans une transaction):

Insérer ce qui n'est pas encore là:

INSERT INTO new_tbl (old_id, data)
SELECT old_id, data
FROM   old_tbl
WHERE  NOT EXISTS (SELECT * FROM new_tbl WHERE new_tbl.old_id = old_tbl.old_id);

Mettez à jour ce qui a changé entre-temps:

UPDATE new_tbl
SET    data  = old.data
USING  old_tbl
WHERE  new_tbl.old_id = old_tbl.old_id
AND    new_tbl.data IS DISTINCT FROM old_tbl.data;

Les nouvelles données ne seront pas touchées, car elles sont identiques aux deux endroits.

Erwin Brandstetter
la source
J'ai quelques questions pour tenter de comprendre le scénario pour lequel vous avez proposé cette réponse: 1. Les modifications de code seront-elles déployées parallèlement au début des modifications de base de données? 2. Pourquoi faudra-t-il écrire aux deux structures? 3. Pourquoi ne peut-on pas d'abord afficher la nouvelle structure, puis migrer les données existantes, puis déployer les modifications de code permettant d'alimenter la nouvelle structure? 4. Pourquoi est-il nécessaire de trouver ce qui n’est pas là (votre première requête)? Proposez-vous l'insertion dans plusieurs tentatives?
Sandeepan Nath
2
@SandeepanNath, pour répondre à la question 3 dans votre commentaire: parce que si vous (a) mettre en place la nouvelle structure, (b) les données Migrer à elle, (c) changer votre code à des données d'écriture à la nouvelle structure au lieu de l'ancien, puis tous Les modifications de données effectuées entre les étapes b et c n'existeront que dans l' ancienne structure. La question était de savoir comment apporter des modifications de schéma sans temps d'arrêt. Lisez à nouveau cette réponse attentivement.
Wildcard