it-swarm.com.de

Best Practices für Schemaänderungen und Datenmigrationen in eine Live-Datenbank ohne Ausfallzeiten?

Wie können Sie Schemaänderungen an einer Live-Datenbank ohne Ausfallzeiten vornehmen?

Nehmen wir zum Beispiel an, ich habe eine PostgreSQL-Datenbank mit einer Tabelle, die verschiedene Benutzerdaten wie E-Mail-Adressen usw. enthält, die alle bestimmten Benutzern zugeordnet sind. Wenn ich die E-Mail-Adressen in eine neue dedizierte Tabelle verschieben wollte, musste ich das Schema ändern und dann die E-Mail-Daten in die neue Tabelle migrieren. Wie könnte dies geschehen, ohne das Schreiben in die ursprüngliche Tabelle zu stoppen? Während Daten von der alten in die neue Tabelle geschrieben werden, werden sicherlich weiterhin neue Daten in die alte Tabelle geschrieben und übersehen, oder?

Ich denke, dieses Problem tritt ziemlich häufig auf, aber ich kann keine Standardlösung finden, um damit umzugehen.

Dieser Artikel befasst sich mit dem Problem, aber ich habe Schritt 3 nicht wirklich verstanden. Er sagt, er soll in beide Tabellen schreiben und dann alte Daten von der ersten Tabelle in die neue migrieren. Wie stellen Sie sicher, dass Sie nur alte Daten migrieren?

(Ich benutze PostgreSQL auf Herok .)

44
Dan Leary

Sie haben fast schon Ihre Antwort:

  1. Erstellen Sie die neue Struktur parallel
  2. Beginnen Sie mit dem Schreiben in beide Strukturen
  3. Migrieren Sie alte Daten in die neue Struktur
  4. Nur neue Struktur schreiben und lesen
  5. Löschen Sie alte Spalten

Verwenden Sie für Schritt Folgendes (in einer Transaktion):

Fügen Sie ein, was noch nicht vorhanden ist:

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);

Aktualisieren Sie, was sich in der Zwischenzeit geändert hat:

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;

Neue Daten werden nicht berührt, da sie an beiden Stellen identisch sind.

27