sql >> Databáze >  >> RDS >> PostgreSQL

Jak se dotazovat na přírůstkové aktualizace postgres od zadaného bodu (časové razítko nebo ID transakce)?

To, co opravdu chcete, je logické dekódování PostgreSQL 9.4 podporu, která vám umožní extrahovat tok změn ze serveru. Chcete-li jej použít, potřebujete plugin pro logické dekódování, který změní stream změn na serveru na něco, co může vaše aplikace spotřebovat. Existuje řada ve vývoji, ale je to ještě docela brzy.

Protože jste v komentáři uvedli, že používáte AWS RDS, v tuto chvíli máte smůlu, protože RDS v době psaní tohoto článku nenabízí žádné dekódovací pluginy a k jejich instalaci byste potřebovali oprávnění superuživatele.

Pro úplné přírůstkové kopírování nemůžete použít xmin a xmax, protože v PostgreSQL nemůžete provádět špinavé čtení, takže nemůžete vidět, zda byla n-tice DELETE d. Chcete-li používat ID transakcí, musíte zabránit VACUUM z odstranění „mrtvých“ řádků, tedy řádků, které žádná aktuální transakce ještě nemusí správně provést. Také byste museli umět špinavé čtení. Ani jeden z nich nemá v PostgreSQL snadná řešení.

Pokud máte tabulky pouze pro vkládání (nebo vložíte a aktualizujete, nikdy neodstraníte a nikdy nezměníte primární klíč řádku), pak můžete případně použít transakci xmin. Budete se muset vypořádat s obtékáním ID transakce zaškrtnutím pg_database.datfrozenxid a pg_class.relfrozenxid pro zájmový vztah. Podrobnosti naleznete ve zdrojovém kódu a komentářích v kódu. VACUUM a nedostatek špinavých čtení není problém, pokud nikdy neodstraníte položku, protože nepotřebujete vidět „zmizelé“ řádky.

Pokud je to možné, použijte logické dekódování ve verzi 9.4+. U starších verzí, pokud potřebujete úplnou replikaci, musíte shromáždit frontu změn se spouštěči.

Pokud můžete zcela zakázat mazání a změny primárního klíče, můžete použít xmin najít změněné řádky, pokud se postaráte o to, aby nedošlo k delete spuštění nebo jakékoli update které mění primary key s.




  1. Dotaz MySQL vrací nežádoucí řádky při načítání řádků na základě konkrétních kombinací značek

  2. CHYBA:Index sloupce je mimo rozsah:1, počet sloupců:0

  3. Sloučit data do dvou cílových tabulek

  4. Jaký je nejjednodušší způsob, jak získat všechny rodiče záznamu pomocí modelu id / parent_id v mysql/php?