Ich möchte eine Tabelle mit mehr als 1 Million Zeilen nach Datumsbereich partitionieren. Wie wird dies in der Regel durchgeführt, ohne dass viel Ausfallzeit erforderlich ist oder das Risiko besteht, dass Daten verloren gehen? Hier sind die Strategien, über die ich nachdenke, die jedoch offen für Vorschläge sind:
Die vorhandene Tabelle ist der Master, und Kinder erben davon. Im Laufe der Zeit werden Daten vom Master zum untergeordneten Element verschoben. In einem bestimmten Zeitraum befinden sich jedoch einige der Daten in der Mastertabelle und andere in den untergeordneten Elementen.
Erstellen Sie eine neue Master- und Kindertabelle. Erstellen Sie eine Kopie der Daten in einer vorhandenen Tabelle in untergeordneten Tabellen (sodass sich die Daten an zwei Stellen befinden). Sobald untergeordnete Tabellen die neuesten Daten enthalten, ändern Sie alle Einfügungen, um auf eine neue Haupttabelle zu verweisen, und löschen Sie die vorhandene Tabelle.
quelle
DELETE FROM ONLY master_table
ist die Lösung.Antworten:
Da # 1 das Kopieren von Daten vom Master auf das Kind erfordert, während es sich in einer aktiven Produktionsumgebung befindet, habe ich mich persönlich für # 2 entschieden (Erstellen eines neuen Masters). Dies verhindert Störungen an der Originaltabelle, während diese aktiv verwendet wird. Wenn Probleme auftreten, kann ich den neuen Master problemlos ohne Probleme löschen und die Originaltabelle weiterhin verwenden. Hier sind die Schritte, um es zu tun:
Erstellen Sie eine neue Mastertabelle.
Erstellen Sie Kinder, die vom Master erben.
Kopieren Sie alle historischen Daten in die neue Mastertabelle
Neue Einfügungen / Aktualisierungen der Produktionsdatenbank vorübergehend anhalten
Kopieren Sie die neuesten Daten in die neue Mastertabelle
Benennen Sie die Tabellen um, sodass new_master zur Produktionsdatenbank wird.
Fügen Sie old_master die Funktion für INSERT-Anweisungen hinzu, damit die Daten an die richtige Partition übergeben werden.
Trigger hinzufügen, damit die Funktion für INSERTS aufgerufen wird
Setzen Sie den Einschränkungsausschluss auf EIN
Aktivieren Sie UPDATES und INSERTS in der Produktionsdatenbank erneut
Richten Sie Trigger oder Cron so ein, dass neue Partitionen erstellt und die Funktion aktualisiert wird, um der richtigen Partition neue Daten zuzuweisen. In diesem Artikel finden Sie Codebeispiele
Löschen Sie old_master_backup
quelle
vacuum
sind, dass Sie aufgrund von Sitzungen mit "inaktiven Transaktionen" nicht aufgeholt oder verhindert wurden.Es gibt ein neues Tool namens pg_pathman ( https://github.com/postgrespro/pg_pathman ), das dies automatisch für Sie erledigt .
So etwas wie das Folgende würde es tun.
quelle