PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie werden inkrementelle Postgres-Updates seit einem bestimmten Zeitpunkt (einem Zeitstempel oder einer Transaktions-ID) abgefragt?

Was Sie wirklich wollen, ist die logische Dekodierung von PostgreSQL 9.4 Unterstützung, mit der Sie einen Änderungsstrom extrahieren können vom Server. Um es zu verwenden, benötigen Sie ein logisches Dekodierungs-Plugin, das den Änderungsstrom auf dem Server in etwas umwandelt, das Ihre App nutzen kann. Es befinden sich einige in der Entwicklung, aber es ist noch ziemlich früh.

Da Sie in einem Kommentar angemerkt haben, dass Sie AWS RDS verwenden, haben Sie derzeit kein Glück, da RDS zum Zeitpunkt des Schreibens keine Decodierungs-Plugins anbietet und Sie Superuser-Berechtigungen benötigen, um sie zu installieren. P>

Sie können xmin und xmax nicht für vollständiges inkrementelles Kopieren verwenden, da Sie in PostgreSQL keine Dirty Reads durchführen können, sodass Sie nicht sehen können, ob ein Tupel DELETE wurde d. Um Transaktions-IDs zu verwenden, müssen Sie VACUUM verhindern vom Entfernen "toter" Zeilen, d. h. Zeilen, die keine aktuelle Transaktion noch korrekt ausführen muss. Sie müssen auch in der Lage sein, Dirty Reads durchzuführen. Für beide gibt es keine einfachen Lösungen in PostgreSQL.

Wenn Sie Nur-Einfüge-Tabellen haben (oder Sie führen Einfügungen und Aktualisierungen durch, löschen niemals und ändern niemals den Primärschlüssel einer Zeile), dann können Sie möglicherweise die Transaktion xmin verwenden. Sie müssen sich mit transaction-id wraparound auseinandersetzen indem Sie pg_database.datfrozenxid überprüfen und pg_class.relfrozenxid für das Interessenverhältnis. Einzelheiten finden Sie im Quellcode und in den Kommentaren im Code. VACUUM und das Fehlen von Dirty Reads ist kein Problem, wenn Sie nie einen Eintrag löschen, da Sie keine "verschwundenen" Zeilen sehen müssen.

Verwenden Sie nach Möglichkeit die logische Dekodierung in 9.4+. Wenn Sie für ältere Versionen eine vollständige Replikation benötigen, müssen Sie eine Änderungswarteschlange mit Triggern ansammeln.

Wenn Sie Löschungen und Änderungen des Primärschlüssels vollständig verbieten können, können Sie xmin verwenden um geänderte Zeilen zu finden, solange Sie darauf achten, dass es keine delete gibt s laufen, oder irgendein update s, die den primary key ändern s.