Det du verkligen vill ha är PostgreSQL 9.4s logiska avkodning support, som låter dig extrahera en ändringsström från servern. För att använda det behöver du ett logiskt avkodningsplugin som gör ändringsströmmen på servern till något som din app kan konsumera. Det finns ett antal under utveckling, men det är fortfarande ganska tidigt.
Eftersom du noterade i en kommentar att du använder AWS RDS, har du för närvarande ingen tur, eftersom RDS i skrivande stund inte erbjuder några avkodningsplugins och du skulle behöva superanvändarprivilegier för att installera dem.
Du kan inte använda xmin och xmax för fullständig inkrementell kopiering, eftersom du inte kan göra smutsiga läsningar i PostgreSQL, så du kan inte se om en tupel har DELETE
d. För att använda transaktions-ID:n måste du förhindra VACUUM
från att ta bort "döda" rader, dvs rader som ingen aktuell transaktion fortfarande behöver utföra korrekt. Du måste också kunna göra smutsavläsningar. Ingen av dessa har enkla lösningar i PostgreSQL.
Om du har tabeller som endast kan infogas (eller så gör du infogar och uppdateringar, tar aldrig bort och ändrar aldrig primärnyckeln för en rad) så kan du eventuellt använda transaktionen xmin. Du kommer att behöva hantera transaction-id wraparound
genom att kontrollera pg_database.datfrozenxid
och pg_class.relfrozenxid
för intresseförhållandet. Se källkoden och kommentarerna i koden för detaljer. VACUUM
och bristen på smutsiga läsningar är inte ett problem om du aldrig tar bort en post, eftersom du inte behöver se "försvunna" rader.
Använd logisk avkodning i 9.4+ om möjligt. För äldre versioner om du behöver fullständig replikering måste du samla en ändringskö med triggers.
Om du kan förbjuda raderingar och ändringar av primärnyckeln helt kan du använda xmin
för att hitta ändrade rader, så länge du ser till att det inte finns någon delete
körs, eller någon update
s som ändrar primary key
s.