sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan forespørges postgres trinvise opdateringer siden et specificeret punkt (et tidsstempel eller et transaktions-id)?

Det, du virkelig ønsker, er PostgreSQL 9.4's logiske afkodning support, som lader dig udtrække en ændringsstrøm fra serveren. For at bruge det har du brug for et logisk afkodningsplugin, der gør ændringsstrømmen på serveren til noget, din app kan forbruge. Der er en række under udvikling, men det er stadig ret tidligt.

Da du i en kommentar bemærkede, at du bruger AWS RDS, er du på nuværende tidspunkt uheldig, da RDS i skrivende stund ikke tilbyder nogen afkodningsplugins, og du skal bruge superbrugerrettigheder for at installere dem.

Du kan ikke bruge xmin og xmax til fuldstændig inkrementel kopiering, fordi du ikke kan lave dirty reads i PostgreSQL, så du kan ikke se, om en tuple er blevet DELETE d. For at bruge transaktions-id'er skal du forhindre VACUUM fra at fjerne "døde" rækker, dvs. rækker, som ingen aktuel transaktion stadig skal udføre korrekt. Du skal også være i stand til at lave beskidte læsninger. Ingen af ​​disse har nemme løsninger i PostgreSQL.

Hvis du har tabeller, der kun kan indsættes (eller du laver indsættelser og opdateringer, sletter aldrig og ændrer aldrig den primære nøgle i en række) så kan du eventuelt bruge transaktionen xmin. Du bliver nødt til at håndtere transaction-id wraparound ved at tjekke pg_database.datfrozenxid og pg_class.relfrozenxid for interesseforholdet. Se kildekoden og kommentarerne i koden for detaljer. VACUUM og manglen på beskidte læsninger er ikke et problem, hvis du aldrig sletter en post, da du ikke behøver at se "forsvundne" rækker.

Brug logisk afkodning i 9.4+, hvis det er muligt. For ældre versioner, hvis du har brug for fuldstændig replikering, skal du akkumulere en ændringskø med triggere.

Hvis du kan forbyde sletninger og ændringer af primær nøgle fuldstændigt, kan du bruge xmin for at finde ændrede rækker, så længe du sørger for at sikre, at der ikke er nogen delete s køre, eller en hvilken som helst update s, der ændrer primary key s.




  1. Sådan får du MySQL til at håndtere UTF-8 korrekt

  2. MySQL - INDSÆT I fra en midlertidig tabel

  3. Nummermaskering &nls_parameter

  4. Hvordan man gør null lig med null i oracle