sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur frågar jag postgres inkrementella uppdateringar sedan en angiven punkt (en tidsstämpel eller ett transaktions-id)?

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.




  1. SQL Server Ändra databasnamn

  2. Kan Oracles standardtidsgräns för objektlås ändras?

  3. Hur man känner till en tidszon för en tidsstämpel i postgresql 8.3

  4. Användning av FLASHBACK i Oracle